受 http://blog.csdn.net/column/details/13024.html 专栏启发,对后续部分进行翻译,方便使用时查阅;
本文翻译自 https://docs.spring.io/spring-boot/docs/1.5.7.RELEASE/reference/htmlsingle
@RestController
@RequestMapping(value="/users")
public class MyRestController {
@RequestMapping(value="/{user}", method=RequestMethod.GET)
public User getUser(@PathVariable Long user) {
// ...
}
@RequestMapping(value="/{user}/customers", method=RequestMethod.GET)
List getUserCustomers(@PathVariable Long user) {
// ...
}
@RequestMapping(value="/{user}", method=RequestMethod.DELETE)
public User deleteUser(@PathVariable Long user) {
// ...
}
}
Spring MVC 是spring框架核心的一部分,详细信息可以在 reference documentation.获取。 这里也有一些涉及Spring MVC的指南可以在 spring.io/guides 获取。
ContentNegotiatingViewResolver
和BeanNameViewResolver
beans.Converter
, GenericConverter
, Formatter
beans.HttpMessageConverters
(详见下文).MessageCodesResolver
(详见下文).index.html
.Favicon
(详见下文).ConfigurableWebBindingInitializer
bean (详见下文).@EnableWebMvc
。如果你想提供自定义的 RequestMappingHandlerMapping
,RequestMappingHandlerAdapter
或 ExceptionHandlerExceptionResolver
实例,你可以声明一个
WebMvcRegistrationsAdapter
实例提供以上组件;
@Configuration
注解上增加@EnableWebMvc 。
HttpMessageConverter
接口来转换HTTP请求和响应。很明显默认开箱即用,例如对象可以自动转换成JSON(使用jackson库)或XML(如果可用使用jackson XML拓展否则使用JAXB)。字符串默认使用 UTF-8
编码。
HttpMessageConverters
类:
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.*;
import org.springframework.http.converter.*;
@Configuration
public class MyConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter> additional = ...
HttpMessageConverter> another = ...
return new HttpMessageConverters(additional, another);
}
}
HttpMessageConverter
bean出现在环境中都将被加入转换器列表。所以你也可考虑重写默认的转换器。
JsonSerializer
和JsonDeserializer
类。自定义序列化通常 通过一个模块使用Jackson注册 ,但是Spring Boot 提供一个 @JsonComponent
注解可以让其立马注册为Spring Beans。
JsonSerializer
或 JsonDeserializer
实现上使用 @JsonComponent
。也可以用在包含序列化/反序列化的内部类上。例如:
import java.io.*; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.*; import org.springframework.boot.jackson.*; @JsonComponent public class Example { public static class Serializer extends JsonSerializer{ // ... } public static class Deserializer extends JsonDeserializer { // ... } }
ApplicationContext
中的 @JsonComponent
beans都将自动使用Jackson注册,且由于 @JsonComponent
使用了元注解 @Component
,所以常见的组件扫描规则也适用于 @JsonComponent
。
JsonObjectSerializer
和 JsonObjectDeserializer
基础类来实现当序列化对象时使用标准的Jackson版本。详见Java文档(See the Javadoc for details)。
MessageCodesResolver
。如果你设置了 spring.mvc.message-codes-resolver.format
属性为 PREFIX_ERROR_CODE
或POSTFIX_ERROR_CODE
(参考 DefaultMessageCodesResolver.Format
中的枚举)则Spring Boot将为你创建一个消息码转换器。
ServletContext
根路径 下一个名为 /static
(或 /public
或/resources
或/META-INF/resources
)的目录视作静态内容。它使用Spring MVC中的 ResourceHttpRequestHandler
来实现,所以你可以通过增加自己的 WebMvcConfigurerAdapter
然后重写 addResourceHandlers
方法来修改这个行为。
ServletContext
根下内容。通常情况下这种情况不会发生(除非你修改了默认的MVC配置),因为Spring总 能够通过 DispatcherServlet
处理请求。
/**
路径,但是你可以通过 spring.mvc.static-path-pattern
来修改。例如,迁移所有资源到 /resources/**
可以通过以下修改完成:
spring.mvc.static-path-pattern=/resources/**
spring.resources.static-locations
( 使用目录路径列表替换默认值) 自定义静态资源位置。如果你这样做了,默认的欢迎页将切换至你定义的位置进行查找,如果在你启用的任何位置中有
index.html
文件,那么它将作为应用的欢迎页使用。
/webjars/**
路径下以webjars格式打包的资源将以jar文件的方式来加载。
如果你的应用将使用jar的方式打包,不要使用 |
webjars-locator
依赖。然后声明你的Webjar,拿jQuery来举例就像在 "/webjars/jquery/x.y.z/dist/jquery.min.js"
中的 "/webjars/jquery/dist/jquery.min.js"
,其中 x.y.z
是Webjars的版本。
如果你在使用JBOOS, 你需要声明 |
:spring.resources.chain.strategy.content.enabled=true spring.resources.chain.strategy.content.paths=/**
使用模板的资源链接在运行时会重写, 这是由于 |
spring.resources.chain.strategy.content.enabled=true spring.resources.chain.strategy.content.paths=/** spring.resources.chain.strategy.fixed.enabled=true spring.resources.chain.strategy.fixed.paths=/js/lib/ spring.resources.chain.strategy.fixed.version=v12有了以上配置,在
"/js/lib/"
下的JavaScript模块可以使用一个固定版本策略
"/v12/js/lib/mymodule.js"
而其他资源仍可以使用
ResourceProperties
获取更多支持操作。
这个特性已经完整地在这个专门的博客 blog post 和在Spring 框架的 reference documentation中写明 |
favicon.ico
,如果存在它将自动用作这个应用的图标。
WebBindingInitializer
来为特殊请求初始化一个 WebDataBinder
.如果你创建了你自己的 ConfigurableWebBindingInitializer
@Bean
, Spring Boot将自动配置 Spring MVC去使用它. 尽可能的不使用JSPs , 这有一些已知的问题( known limitations )在使用内嵌的servlet容器时 |
src/main/resources/templates
来加载。
IntelliJ IDEA 决定不同的 classpath 依赖于你如何运行你的应用。 在IDE中通过main方法运行和通过使用Maven或Gradle打包的jar文件来运行应用的顺序是不同的。这会导致Spring Boot不能发现classpath下的模板。如果你受此问题影响,你可以在IDE中重新调整模块级别和资源优先级。 或者, 你可以配置模板前缀在classpath中搜索每一个模板目录: |
/error
映射以一种合理的方式处理所有的错误,它会在servlet容器中注册一个全局的错误页。于客户端而言,它会返回一个JSON响应包含错误的详细信息,HTTP状态和异常消息。对浏览器而言则提供一个使用HTML格式的相同数据展现的白页错误视图(如想定制,仅需增加一个解决错误的视图)。要想完全替换默认的行为,你需要实现 ErrorController
且注册一个此类型的bean,或者增加一个使用现有机制但是替换内容的 ErrorAttributes
类型的bean。
这 |
@ControllerAdvice
来定制返回的JSON文档。
@ControllerAdvice(basePackageClasses = FooController.class) public class FooControllerAdvice extends ResponseEntityExceptionHandler { @ExceptionHandler(YourException.class) @ResponseBody ResponseEntity> handleControllerException(HttpServletRequest request, Throwable ex) { HttpStatus status = getStatus(request); return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status); } private HttpStatus getStatus(HttpServletRequest request) { Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); if (statusCode == null) { return HttpStatus.INTERNAL_SERVER_ERROR; } return HttpStatus.valueOf(statusCode); } }
FooController
包下定义的任何controller抛出了 YourException
,将返回一个代表 CustomerErrorType
对象的json替换原有的 ErrorAttributes
对象。
/error
文件夹下增加相应的页面。错误页既可以使用静态HTML(也就是在任何静态资源文件夹下增加)或者使用模板构建。但是文件名必须是准确的状态码或者掩码。
404
到一个静态HTML文件,你的文件结构应该类似如下:
src/ +- main/ +- java/ | +
5xx
错误,你需要一个类似下面的结构:
src/ +- main/ +- java/ | +
ErrorViewResolver
接口的beans。
public class MyErrorViewResolver implements ErrorViewResolver { @Override public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map你也可以使用普通的SpringMVC特性诸如model) { // Use the request or status to optionally return a ModelAndView return ... } }
@ExceptionHandler
methods
and
@ControllerAdvice
。那么 ErrorController
将接管任何未处理的异常。
ErrorPageRegistrar
接口直接注册 ErrorPages
。那么尽管你没有SpringMVC的 DispatcherServlet
, 提取工作仍将在内嵌的servlet容器下直接工作且有效运行。
@Bean public ErrorPageRegistrar errorPageRegistrar(){ return new MyErrorPageRegistrar(); } // ... private static class MyErrorPageRegistrar implements ErrorPageRegistrar { @Override public void registerErrorPages(ErrorPageRegistry registry) { registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400")); } }
ErrorPage
到一个路径上,确保它被一个 Filter
拦截处理(例如像一些通常没有Spring-web框架的做法,如Jersy和Wicket),并且这个 Filter
需明确被注册为一个 ERROR
dispatcher,例如:
@Bean public FilterRegistrationBean myFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new MyFilter()); ... registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class)); return registration; }(默认的
FilterRegistrationBean
不包含 ERROR
调度类型)。
com.ibm.ws.webcontainer.invokeFlushAfterService
为 false
来关闭此行为。
@EnableHypermediaSupport
和注册beans数量来方便构建超媒体基础应用
,包含一个 LinkDiscoverers
(对客户端的支持)和一个 ObjectMapper
配置来正确引导响应给所需。 ObjectMapper
配置需要基于 spring.jackson.*
属性或者一个存在的Jackson2ObjectMapperBuilder
bean。
@EnableHypermediaSupport
控制Spring HATEOAS的配置。注意这将不显示上面所说的 ObjectMapper
的定义。
@CrossOrigin
注解的控制器方法CORS 配置不需要任何特殊配置。全局CORS配置会通过注册一个含有自定义 addCorsMappings(CorsRegistry)
方法的WebMvcConfigurer
bean定义:
@Configuration public class MyConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**"); } }; } }
Servlet
或Filter
注册为一个 @Bean
,那么Jersey 1.x和Apache CXF会得到很好的支持。Jersey 2.x 开始对Spring有了原生支持,所以我们在Spring Boot中为她提供了自动配置支持作为起步。
spring-boot-starter-jersey
依赖,然后在你所有注册的终端中需要配一个 ResourceConfig
类型的 @Bean
:
@Component public class JerseyConfig extends ResourceConfig { public JerseyConfig() { register(Endpoint.class); } }
Jersey对可执行文件扫描支持有限。例如她在运行一个可执行的war文件时不会扫描 |
ResourceConfigCustomizer
的beans来满足更多定制需求。
@Components
注解(如@GET
等) 例如:
@Component @Path("/hello") public class Endpoint { @GET public String message() { return "Hello"; } }由于终端作为Spring的一个组件后,她的生命周期被Spring管理,所以你可以
@Autowired
依赖注入,使用 @Value
获取外部的配置值。Jersey servlet会被注册进来且默认映射到 /*
。你可以通过增加@ApplicationPath
到你的 ResourceConfig
来改变这个映射规则。
jerseyServletRegistration
类型为 ServletRegistrationBean
的 @Bean
的 Servlet。默认情况下,这个servlet是懒加载,除非你自定义了 spring.jersey.servlet.load-on-startup
。你可以通过创建同名bean来禁用或重写上述的bean ,也可以使用一个拦截器通过设置 spring.jersey.type=filter
代替servlet(此情况下需要一个Bean来替换或重写jerseyFilterRegistration
)。Servlet可以通过 @Order
(你可以设置spring.jersey.filter.order
来启用)配置顺序。Servlet和Filter都可以通过 spring.jersey.init.*
指定的map属性给定初始化参数。
8080
监听HTTP请求。
如果你选择在CentOS上使用Tomcat需要注意, 默认情况下, 需要一个临时文件夹用于存储编译的JSPs,上传的文件等. 这个目录可能被 |
HttpSessionListener
)通过使用Spring beans的方式或者扫描查找Servlet组件的方式。
Servlet
, Filter
或Servlet *Listener
实例作为一个Spring bean被注册到内嵌的容器中。这样很方便你从 application.properties
中获取一个配置期间配置的值。
/
,在 多Servlet beans的情况下,bean名字将用作路径前缀。拦截器会映射到 /*
。
ServletRegistrationBean
,FilterRegistrationBean
和 ServletListenerRegistrationBean
类来获得完全控制。
javax.servlet.ServletContainerInitializer
接口,或Spring的 org.springframework.web.WebApplicationInitializer
接口。这个人为设计移栽减少在一个war包中运行的第三方类库破坏Spring Boot应用的风险。
org.springframework.boot.context.embedded.ServletContextInitializer
接口的bean。这个唯一 onStartup
方法提供了对 ServletContext
的访问,在需要时可以很方便的当已存在的 WebApplicationInitializer
的适配器。
@ServletComponentScan
可以自动发现并注册 @WebServlet
, @WebFilter
, 和@WebListener
注解的类。
|
ApplicationContext
。 EmbeddedWebApplicationContext
是一个特殊的 WebApplicationContext
,通过寻找一个单一的EmbeddedServletContainerFactory
bean来自引导。通常TomcatEmbeddedServletContainerFactory
, JettyEmbeddedServletContainerFactory
, 或UndertowEmbeddedServletContainerFactory
会被自动配置。
你通常不需要了解这些实现类。大部分的应用会为你自动配置和创建 |
Environment
属性可以设置通用Servlet容器配置。通常你会在你的 application.properties
文件中进行定义。
server.address
,等。server.session.persistence
), session超时 (server.session.timeout
),session数据位置(server.session.store-dir
) 和session-cookie配置(server.session.cookie.*
).。server.error.path
)等。server.tomcat
和server.undertow
) 。对于实体,访问日志配置了内嵌Servlet容器的特征码。
参考 |
EmbeddedServletContainerCustomizer
接口的Spring bean。 EmbeddedServletContainerCustomizer
对 提供很多自定义设置方法的ConfigurableEmbeddedServletContainer
的访问。
import org.springframework.boot.context.embedded.*; import org.springframework.stereotype.Component; @Component public class CustomizationBean implements EmbeddedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.setPort(9000); } }
TomcatEmbeddedServletContainerFactory
, JettyEmbeddedServletContainerFactory
或 UndertowEmbeddedServletContainerFactory
bean。
@Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); factory.setPort(9000); factory.setSessionTimeout(10, TimeUnit.MINUTES); factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html")); return factory; }
error.jsp
也不会覆盖这个默认的错误处理视图,该视图原本应被自定义的错误页替换。