问题一 path=”users”, collectionResourceRel=”users” 如何与 Spring Data Rest 一起使用?
@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRestRepository extends
PagingAndSortingRepository<User, Long>
path- 这个资源要导出的路径段。
collectionResourceRel- 生成指向集合资源的链接时使用的 rel 值。在生成 HATEOAS 链接时使用
问题二 当 Spring Boot 应用程序作为 Java 应用程序运行时,后台会发生什么?
如果你使用 Eclipse IDE,Eclipse maven 插件确保依赖项或者类文件的改变一经添加,就会被编译并在目标文件中准备好!在这之后,就和其它的 Java 应用程序一样了。
(1)当你启动 java 应用程序的时候,spring boot 自动配置文件就会魔法般的启用了。
(2)当Spring Boot 应用程序检测到你正在开发一个 web 应用程序的时候,它就会启动 tomcat。
问题三 我们能否在 spring-boot-starter-web 中用 jetty 代替 tomcat?
在 spring-boot-starter-web 移除现有的依赖项,并把下面这些添加进去。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
问题四 如何使用 Spring Boot 生成一个 WAR 文件?
1、在pom.xml里定义打包类型
<packaging>war</packaging>
2、添加Spring Boot启动器(也可通过parent)
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3、添加spring-boot-starter-web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
4、添加打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
5、主类继承SpringBootServletInitializer
/**
* WAR application
*/
@SpringBootApplication
public class WarApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(WarApplication.class, args);
}
}
6、执行mvn clean package打包
$mvn clean package
7、将打好的war包拷贝到容器(如tomcat)运行即可。
这里需要简单说明下:
主应用可以重写SpringBootServletInitializer里面有configure方法,自定义配置Spring Boot。
/**
* Configure the application. Normally all you would need to do is to add sources
* (e.g. config classes) because other settings have sensible defaults. You might
* choose (for instance) to add default command line arguments, or set an active
* Spring profile.
* @param builder a builder for the application context
* @return the application builder
* @see SpringApplicationBuilder
*/
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder;
}
问题五 如何使用 Spring Boot 部署到不同的服务器?
你需要做下面两个步骤:
在一个项目中生成一个 war 文件。
将它部署到你最喜欢的服务器(websphere 或者 Weblogic 或者 Tomcat and so on)。
第一步:这本入门指南应该有所帮助:
https://spring.io/guides/gs/convert-jar-to-war/
第二步:取决于你的服务器。
问题六 RequestMapping 和 GetMapping 的不同之处在哪里?
RequestMapping 具有类属性的,可以进行 GET,POST,PUT 或者其它的注释中具有的请求方法。
GetMapping 是 GET 请求方法中的一个特例。它只是 ResquestMapping 的一个延伸,目的是为了提高清晰度。
问题七 为什么我们不建议在实际的应用程序中使用 Spring Data Rest?
我们认为 Spring Data Rest 很适合快速原型制造!在大型应用程序中使用需要谨慎。
通过 Spring Data REST 你可以把你的数据实体作为 RESTful 服务直接发布。
当你设计 RESTful 服务器的时候,最佳实践表明,你的接口应该考虑到两件重要的事情:
你的模型范围。
你的客户。
通过 With Spring Data REST,你不需要再考虑这两个方面,只需要作为 TEST 服务发布实体。
这就是为什么我们建议使用 Spring Data Rest 在快速原型构造上面,或者作为项目的初始解决方法。对于完整演变项目来说,这并不是一个好的注意。
问题八 可以配置 application.propertierde 的完整的属性列表在哪里可以找到?
这里是完整的指南:
https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
#================================================= ==================
#COMMON SPRING BOOT PROPERTIES
##
此样本文件作为指南提供。请勿将
#complete整体
复制到您自己的应用程序中。^^^ #============================================== =====================
#----------------------------------------
#CORE PROPERTIES
#----- -----------------------------------
debug = false #启用调试日志。
trace = false #启用跟踪日志。
#logGING
logging.config = #日志配置文件的位置。例如,Logback的`classpath:logback.xml`。
logging.exception-conversion-word =%wEx #记录异常时使用的转换字。
logging.file = #日志文件名(例如,`myapp.log`)。名称可以是精确位置或相对于当前目录。
logging.file.max-history = 0 #要保留的归档日志文件的最大值。仅支持默认的logback设置。
logging.file.max-size = 10MB #最大日志文件大小。仅支持默认的logback设置。
logging.group。* =#记录组以同时快速更改多个记录器。例如,`logging.level.db = org.hibernate,org.springframework.jdbc`。
logging.level。* = #日志级别严重性映射。例如,`logging.level.org.springframework = DEBUG`。
logging.path = #日志文件的位置。例如,`/ var / log`。
logging.pattern.console = #用于输出到控制台的Appender模式。仅支持默认的Logback设置。
logging.pattern.dateformat = yyyy-MM-dd HH:mm:ss.SSS #日志日期格式的Appender模式。仅支持默认的Logback设置。
logging.pattern.file =#用于输出到文件的Appender模式。仅支持默认的Logback设置。
logging.pattern.level =%5p #日志级别的Appender模式。仅支持默认的Logback设置。
logging.register-shutdown-hook = false #在日志记录系统初始化时注册一个关闭钩子。
#AOP
spring.aop.auto =真#添加@EnableAspectJAutoProxy。
spring.aop.proxy-target-class = true #是否要创建基于子类的(CGLIB)代理(true),而不是基于标准Java接口的代理(false)。
#IDENTITY (ContextIdApplicationContextInitializer)
spring.application.name = #应用程序名称。
#ADMIN (SpringApplicationAdminJmxAutoConfiguration)
spring.application.admin.enabled = false #是否为应用程序启用管理功能。
spring.application.admin.jmx-name = org.springframework.boot:type = Admin,name = SpringApplication #JMX 应用程序管理员MBean的名称。
#AUTO-CONFIGURATION
spring.autoconfigure.exclude = #要排除的自动配置类。
#BANNER
spring.banner.charset = UTF-8 #横幅文件编码。
spring.banner.location = classpath:banner.txt #横幅文本资源位置。
spring.banner.image.location = classpath:banner.gif #横幅图像文件位置(也可以使用jpg或png)。
spring.banner.image.width = 76 #字符中的横幅图像的宽度。
spring.banner.image.height = #crs 中横幅图像的高度(默认基于图像高度)。
spring.banner.image.margin = 2 #字符中的左手图像边距。
spring.banner.image.invert = false #是否应针对暗终端主题反转图像。
#SPRING CORE spring.beaninfo.ignore = true #是否跳过BeanInfo类的搜索。
#SPRING CACHE(CacheProperties)
spring.cache.cache-names = #Cmama 分隔的要创建的缓存名称列表(如果底层缓存管理器支持)。
spring.cache.caffeine.spec = #用于创建缓存的规范。有关规格格式的更多详细信息,请参阅CaffeineSpec。
spring.cache.couchbase.expiration = #条目到期。默认情况下,条目永不过期。请注意,此值最终会转换为秒。
spring.cache.ehcache.config = #用于初始化EhCache的配置文件的位置。
spring.cache.infinispan.config = #用于初始化Infinispan的配置文件的位置。
spring.cache.jcache.config = #用于初始化缓存管理器的配置文件的位置。
spring.cache.jcache.provider = #CachingProvider实现的完全限定名称,用于检索符合JSR-107的缓存管理器。仅当类路径上有多个JSR-107实现时才需要。
spring.cache.redis.cache-null-values = true #允许缓存空值。
spring.cache.redis.key-prefix = #键前缀。
spring.cache.redis.time-to-live = #条目到期。默认情况下,条目永不过期。
spring.cache.redis.use-key-prefix = true#写入Redis时是否使用密钥前缀。
spring.cache.type = #Cache 类型。默认情况下,根据环境自动检测。
#SPRING CONFIG - 仅使用环境属性(ConfigFileApplicationListener)
spring.config.additional-location = #配置除默认值之外使用的文件位置。
spring.config.location = #配置替换默认值的文件位置。
spring.config.name = application #配置文件名。
#HAZELCAST(HazelcastProperties)
spring.hazelcast.config = #用于初始化Hazelcast的配置文件的位置。
#PROJECT INFORMATION(ProjectInfoProperties)
spring.info.build.encoding = UTF-8 #文件编码。
spring.info.build.location = classpath:META-INF / build-info.properties #生成的build-info.properties文件的位置。
spring.info.git.encoding = UTF-8 #文件编码。
spring.info.git.location =类路径:git.properties 生成的git.properties文件#所在。
#JMX
spring.jmx.default域 = #JMX域名。
spring.jmx.enabled = true #将管理bean公开给JMX域。
spring.jmx.server = mbeanServer #MBeanServer bean name。
spring.jmx.unique-names = false #是否应确保唯一的运行时对象名称。
#Email (MailProperties)
spring.mail.default-encoding = UTF-8 #默认MimeMessage编码。
spring.mail.host = #SMTP 服务器主机。例如,`smtp.example.com`。
spring.mail.jndi-name = #会话JNDI名称。设置时,优先于其他会话设置。
spring.mail.password = #SMTP 服务器的登录密码。
spring.mail.port = #SMTP 服务器端口。
spring.mail.properties。* = #其他JavaMail会话属性。
spring.mail.protocol = smtp #SMTP服务器使用的协议。
spring.mail.test-connection = false#是否在启动时测试邮件服务器是否可用。
spring.mail.username = #STP 服务器的登录用户。
#APICING SETTINGS(SpringApplication)
spring.main.allow-bean-definition-overriding = false #是否允许通过注册与现有定义同名的定义来覆盖bean定义。
spring.main.banner-mode = console #用于在应用程序运行时显示横幅的模式。
spring.main.sources = 要包含在ApplicationContext中的
#Sources (类名,包名或XML资源位置)。spring.main.web-application-type = #用于显式请求特定类型的Web应用程序的标志。如果未设置,则根据类路径自动检测。
#FILE ENCODING(FileEncodingApplicationListener)
spring.mandatory-file-encoding = #应用程序必须使用的预期字符编码。
#INTEREMENTIZATION (MessageSourceProperties)
spring.messages.always-use-message-format = false #是否始终应用MessageFormat规则,甚至解析不带参数的消息。
spring.messages.basename = messages #逗号分隔的basenames列表(本质上是一个完全限定的类路径位置),每个都遵循ResourceBundle约定,轻松支持基于斜杠的位置。
spring.messages.cache-duration = #加载的资源包文件缓存持续时间。未设置时,捆绑包将永久缓存。如果未指定持续时间后缀,则将使用秒。
spring.messages.encoding = UTF-8 #消息包编码。
spring.messages.fallback-to-system-locale = true #如果找不到特定区域设置的文件,是否回退到系统区域设置。
spring.messages.use-code-as-default-message = false #是否使用消息代码作为默认消息而不是抛出“NoSuchMessageException”。仅在开发期间推荐。
#OUTPUT
spring.output.ansi.enabled =检测#配置的ANSI输出。
#PID FILE(ApplicationPidFileWriter)
spring.pid.fail-on-write-error = #如果使用ApplicationPidFileWriter但它无法写入PID文件,则失败。
spring.pid.file = #要写入的PID文件的位置(如果使用ApplicationPidFileWriter)。
#PROFILES
spring.profiles.active = #逗号分隔的有源配置文件列表。可以通过命令行开关覆盖。
spring.profiles.include = #无条件地激活指定的逗号分隔的配置文件列表(如果使用YAML,则激活配置文件列表)。
#Quartz调度器(QuartzProperties)
spring.quartz.auto-启动 =真#是否自动启动初始化后的调度。
spring.quartz.jdbc.comment-prefix = - #SQL 初始化脚本中单行注释的前缀。
spring.quartz.jdbc.initialize-schema = embedded #数据库模式初始化模式。
spring.quartz.jdbc.schema = classpath:org / quartz / impl / jdbcjobstore / tables_ @ @ platform @@ .sql #用于初始化数据库模式的SQL文件的路径。
spring.quartz.job-store-type = memory #Quartz作业存储类型。
spring.quartz.overwrite-existing-jobs = false #配置的作业是否应覆盖现有的作业定义。
spring.quartz.properties。* = #其他Quartz Scheduler属性。
spring.quartz.scheduler-name = quartzScheduler #调度程序的名称。
spring.quartz.startup-delay = 0s #一旦初始化完成,调度程序启动之后的延迟。
spring.quartz.wait-for-jobs-to-complete-on-shutdown = false #是否等待关闭时运行的作业完成。
#REACTOR (ReactorCoreProperties)
spring.reactor.stacktrace -mode.enabled = false #Reactor 是否应该在运行时收集堆栈跟踪信息。
#SENDGRID(SendGridAutoConfiguration)
spring.sendgrid.api-key = #SendGrid API密钥。
spring.sendgrid.proxy.host = #SendGrid代理主机。
spring.sendgrid.proxy.port = #SendGrid代理端口。
#TASK EXECUTION(TaskExecutionProperties)
spring.task.execution.pool.allow-core-thread-timeout = true #是否允许核心线程超时。这可以实现池的动态增长和收缩。
spring.task.execution.pool.core-size = 8 #核心线程数。
spring.task.execution.pool.keep-alive = 60s #终止之前线程可能保持空闲的时间限制。
spring.task.execution.pool.max-size = #允许的最大线程数。如果任务正在填满队列,则池可以扩展到该大小以适应负载。如果队列无限制,则忽略。
spring.task.execution.pool.queue-capacity =#队列容量。无限制容量不会增加池,因此会忽略“max-size”属性。
spring.task.execution.thread-name-prefix = task- #用于新创建的线程名称的前缀。
#TASK SCHEDULING(TaskSchedulingProperties)
spring.task.scheduling.pool.size = 1#允许的最大线程数。
spring.task.scheduling.thread-name-prefix = scheduling- #用于新创建的线程名称的前缀。
#----------------------------------------
#WEB PROPERTIES
#----- -----------------------------------
#EmbEDDED SERVER CONFIGURATION(ServerProperties)
server.address = #服务器应绑定到的网络地址。
server.compression.enabled = false #是否启用了响应压缩。
server.compression.excluded-user-agents = #逗号分隔的用户代理列表,不应压缩响应。
server.compression.mime-types = text / html,text / xml,text / plain,text / css,text / javascript,application / javascript,application / json,application / xml #逗号分隔的MIME类型列表应该是压缩。
server.compression.min-response-size = 2KB#要执行压缩所需的最小“Content-Length”值。
server.connection-timeout = #连接器在关闭连接之前等待另一个HTTP请求的时间。未设置时,将使用连接器的特定于容器的默认值。使用值-1表示没有(即无限)超时。
server.error.include-exception = false#包括“exception”属性。
server.error.include-stacktrace = never#启用扩展NCSA格式。#何时包含“stacktrace”属性。
server.error.path = / error #错误控制器的路径。
server.error.whitelabel.enabled = true#是否在服务器出错时启用浏览器中显示的默认错误页面。
server.http2.enabled = false #是否启用HTTP / 2支持,如果当前环境支持它。
server.jetty.acceptors = -1 #要使用的接受者线程数。当值为-1(默认值)时,接受器的数量是从操作环境派生的。
server.jetty.accesslog.append = false #追加到日志。
server.jetty.accesslog.date-format = dd / MMM / yyyy:HH:mm:ss Z #请求日志的时间戳格式。
server.jetty.accesslog.enabled = false #启用访问日志。
server.jetty.accesslog.extended-format = false
server.jetty.accesslog.file-date-format = #日期格式放在日志文件名中。
server.jetty.accesslog.filename = #日志文件名。如果未指定,则日志重定向到“System.err”。
server.jetty.accesslog.locale = #请求日志的区域设置。
server.jetty.accesslog.log-cookies = false #启用请求cookie的记录。
server.jetty.accesslog.log-latency = false #启用请求处理时间的记录。
server.jetty.accesslog.log-server = false #启用请求主机名的日志记录。
server.jetty.accesslog.retention-period = 31#删除旋转日志文件前的天数。
server.jetty.accesslog.time-zone = GMT #请求日志的时区。
server.jetty.max-http-post-size = 200000B #HTTP post或put内容的最大大小。
server.jetty.selectors = -1 #要使用的选择器线程数。当值为-1时,默认情况下,选择器的数量是从操作环境派生的。
server.max-http-header-size = 8KB #HTTP 邮件头的最大大小。
server.port = 8080 #服务器HTTP端口。
server.server-header = #用于Server响应头的值(如果为空,则不发送头)。
server.use-forward-headers = #是否应将X-Forwarded- *头应用于HttpRequest。
server.servlet.context-parameters。* = #Servlet context init参数。
server.servlet.context-path = #应用程序的上下文路径。
server.servlet.application-display-name = application应用程序的server.servlet.jsp.init-parameters。* = #用于配置JSP servlet的Init参数。server.servlet.jsp.registered = true#显示应用程序的名称。
server.servlet.jsp.class-name = org.apache.jasper.servlet.JspServlet #用于JSP的servlet的类名。
#是否已注册JSP servlet。server.servlet.session.cookie.comment = #会话cookie的评论。server.servlet.session.cookie.domain = #会话cookie的域名。server.servlet.session.cookie.http-only = #是否对会话cookie使用“HttpOnly”cookie。server.servlet.session.cookie.max-age = #会话cookie的最大年龄。如果未指定持续时间后缀,则将使用秒。server.servlet.session.cookie.name =
#会话cookie名称。
server.servlet.session.cookie.path = #会话cookie的路径。
server.servlet.session.cookie.secure =#是否始终将会话cookie标记为安全。
server.servlet.session.persistent = false #是否在重新启动之间保留会话数据。
server.servlet.session.store-dir = #用于存储会话数据的目录。
server.servlet.session.timeout = 30m #会话超时。如果未指定持续时间后缀,则将使用秒。
server.servlet.session.tracking-modes = #会话跟踪模式。
server.ssl.ciphers = #支持的SSL密码。
server.ssl.client-auth = #客户端身份验证模式。
server.ssl.enabled = true #是否启用SSL支持。
server.ssl.enabled-protocols = #启用SSL协议。
server.ssl.key-alias = #标识密钥库中密钥的别名。
server.ssl.key-password = #用于访问密钥库中密钥的密码。
server.ssl.key-store = #保存SSL证书的密钥库的路径(通常是jks文件)。
server.ssl.key-store-password = #用于访问密钥库的密码。
server.ssl.key-store-provider = #密钥库的提供者。
server.ssl.key-store-type = #密钥库的类型。
server.ssl.protocol = TLS #要使用的SSL协议。
server.ssl.trust-store = #持有SSL证书的信任存储。
server.ssl.trust-store-password#是否缓冲输出以使其仅定期刷新。server.tomcat.accesslog.directory = logs= #用于访问信任库的密码。
server.ssl.trust-store-provider = #信任存储的提供者。
server.ssl.trust-store-type = #信任库的类型。
server.tomcat.accept-count = 100 #当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。
server.tomcat.accesslog.buffered = true #创建日志文件的目录。可以是绝对的或相对于Tomcat基础目录。server.tomcat.accesslog.enabled = false #启用访问日志。server.tomcat.accesslog.file-date-format = .yyyy-MM-dd #要放在日志文件名中的日期格式。
server.tomcat.accesslog.pattern = common #访问日志的格式模式。
server.tomcat.accesslog.prefix = access_log #日志文件名前缀。
server.tomcat.accesslog.rename-on-rotate = false #是否延迟在文件名中包含日期戳,直到旋转时间。
server.tomcat.accesslog.request-attributes-enabled = false#设置用于请求的IP地址,主机名,协议和端口的请求属性。
server.tomcat.accesslog.rotate = true #是否启用访问日志轮换。
server.tomcat.accesslog.suffix = .log #日志文件名后缀。
server.tomcat.additional-tld-skip-patterns = #逗号分隔的其他模式列表,这些模式匹配要忽略的TLD扫描的jar。
server.tomcat.background-processor-delay = 10s#调用backgroundProcess方法之间的延迟。如果未指定持续时间后缀,则将使用秒。
server.tomcat.basedir = #Tomcat 基目录。如果未指定,则使用临时目录。
server.tomcat.internal-proxies = 10 \\。\\ d {1,3} \\。\\ d {1,3} \\。\\ d {1,3} | \\
。192 \\ 168 \\ d {1,3} \\ d {1,3} | \\
。169 \\ 254 \\ d {1,3} \\ d {1,3} | \\
。127 \\ d {1,3} \\ d {1,3} \\ d {1,3} | \\
172 \\ 1 [6-9] {1} \\ d {1,3} \\ d {1,3} |。。\\
172 \\ 2 [0-9] {1} \\ d {1,3} \\ d {1,3} |。。\\
172 \\。3 [0-1] {1} \\。\\ d {1,3} \\。\\ d {1,3} \\
0:0:0:0:0:0:0:1 \\
:: 1 #正则表达式匹配要信任的代理。
server.tomcat.max-connections = 10000 #服务器在任何给定时间接受和处理的最大连接数。
server.tomcat.max-http-post-size = 2MB #HTTP 帖子内容的最大大小。
server.tomcat.max-swallow-size = 2MB #要吞咽的最大请求体数量。
server.tomcat.max-threads = 200 #最大工作线程数。
server.tomcat.min-spare-threads = 10 #最小工作线程数。
server.tomcat.port-header = X-Forwarded-Port#用于覆盖原始端口值的HTTP头的名称。
server.tomcat.protocol-header = #包含传入协议的标头,通常命名为“X-Forwarded-Proto”。
server.tomcat.protocol-header-https-value = https #协议标头的值,指示传入请求是否使用SSL。
server.tomcat.redirect-context-root = true #是否应通过在路径中附加/来重定向对上下文根的请求。
server.tomcat.remote-ip-header = #从中提取远程IP的HTTP头的名称。例如,`X-FORWARDED-FOR`。
server.tomcat.resource.allow-caching = true#是否允许此Web应用程序使用静态资源缓存。
server.tomcat.resource.cache-ttl = #静态资源缓存的生存时间。
server.tomcat.uri-encoding = UTF-8 #用于解码URI的字符编码。
server.tomcat.use-relative-redirects = #通过调用sendRedirect生成的HTTP 1.1和更高版本的位置标头是使用相对还是绝对重定向。
server.undertow.accesslog.dir = #Undertow 访问日志目录。
server.undertow.accesslog.enabled = false #是否启用访问日志。
server.undertow.accesslog.pattern = common #访问日志的格式模式。
server.undertow.accesslog.prefix = access_log。#日志文件名前缀。
server.undertow.accesslog.rotate = true #是否启用访问日志轮换。
server.undertow.accesslog.suffix = log #日志文件名后缀。
server.undertow.buffer-size = #每个缓冲区的大小。
server.undertow.direct-buffers = #是否在Java堆外部分配缓冲区。默认值源自JVM可用的最大内存量。
server.undertow.eager-filter-init = true #是否应在启动时初始化servlet过滤器。
server.undertow.io-threads =#为worker创建的I / O线程数。默认值源自可用处理器的数量。
server.undertow.max-http-post-size = -1B #HTTP 帖子内容的最大大小。当值为-1时,默认值为大小无限制。
server.undertow.worker-threads = #工作线程数。默认值是I / O线程数的8倍。
#FREEMARKER(FreeMarkerProperties)
spring.freemarker.allow-request-override = false #是否允许HttpServletRequest属性覆盖(隐藏)控制器生成的同名模型属性。
spring.freemarker.allow-session-over