简介
ontroller
或者
@RestController
beans 去处理http的请求。在你的control的方法中将会使用
@RequestMapping
映注解映射成URL。
@RestController
列子处理json数据:代码如下:@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) {
// ...
}
}
Converter
, GenericConverter
, 与 Formatter
beans HttpMessageConverters
MessageCodesResolver
Favicon
支持RequestMappingHandlerMapping
,
RequestMappingHandlerAdapter
, or
ExceptionHandlerExceptionResolver的
实例。可以使用
WebMvcRegistrationsAdapter提供组件。
@EnableWebMvc 。
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);
}
}
@JsonComponent
使其能够快速注册到json上去。你可以使用
@JsonComponent
直接进行
n
JsonSerializer
or
JsonDeserializer
的转换,也可以使用内部类的形式:代码如下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 {
// ...
}
}
使用
@JsonComponent
会自动注册到jackson,因为
@JsonComponent
的元数据使用
@Component,
数,
component-scanning能够被应用。
MessageCodesResolver
来根据产生的错误码来提示对应的错误信息。如果你设置了
spring.mvc.message-codes-resolver.format属性
PREFIX_ERROR_CODE
或者是
POSTFIX_ERROR_CODE
/static
(
/public
,
/resources
,
/META-INF/resources
)作为静态资源路径,它使用来自于
from Spring WebFlux的
ResourceWebHandler以便能修改其行为。
/**
,,但是可以通过设置
spring.webflux.static-path-pattern
进行调整,例如将资源重定位到
/resources/**
下,可以使用如下配置spring.webflux.static-path-pattern=/resources/**
通过使用
spring.resources.static-locations
可以自定义资源路径位置。也可以通过使用webjar的方式如果其打包为jar。
webjars-locator
依赖。比如:使用jquery为例:使用
"/webjars/jquery/dist/jquery.min.js"
的结果为
"/webjars/jquery/x.y.z/dist/jquery.min.js"
.。如果使用jboss的话还需要依赖
webjars-locator-jboss-vfs
,否则会报404错误。
,、其主要配置为:spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
当动态加载资源的时候,js模块加载,文件命名是不打开的,那就是为什么其他策略被支持并且能够被组合。一种修订的策略是在URL中
"fixed"中修定一个静态版本,不用更改其名字。如下配置: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版本使用
"/js/lib/"
使用上述配置之后为
(
"/v12/js/lib/mymodule.js"
),其他的资源内容也是如下
(
).
WebBindingInitializer
去初始化
WebDataBinder
初和特殊的请求。如果你创建
ConfigurableWebBindingInitializer
@bean,
Spring Boot自动配置
Spring MVC
去配置它。
src/main/resources/templates
ErrorController
注册一个bean的类型并且添加一个
ErrorAttributes
的bean通过替换成内容去实现已存在的机制。
@ControllerAdvice
去自定义一个json文档返回一个特别的控制或者是异常类型。如下例子:
@ControllerAdvice(basePackageClasses = AcmeController.class)
public class AcmeControllerAdvice 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);
}
}
10.1 自定义错误页
/error
的文件夹。错误页面可以是一个静态的HTML或者是一个使用模板构建的。文件的名字必须要有准备的状态码或者是一系列的掩码。
src/
+- main/
+- java/
| +
通过使用模板映射到5xx的错误,你的文件夹的结构应该如下:
src/
+- main/
+- java/
| +
对于一些比较复杂的映射,可以通过实现接口
ErrorViewResolver
来完成,如下列子
public class MyErrorViewResolver implements ErrorViewResolver {
@Override
public ModelAndView resolveErrorView(HttpServletRequest request,
HttpStatus status, Map model) {
// Use the request or status to optionally return a ModelAndView
return ...
}
}
10.2 非spring mvc映射错误文件
ErrorPageRegistrar
指向错误页面,如下代码所示:@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"));
}
}
如果注册的错误文件的路径在一个过滤器里面,其
Filter
要指定错误的分发:如下代码@Bean
public FilterRegistrationBean myFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter());
...
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
return registration;
}
10.3在websphere上处理错误
com.ibm.ws.webcontainer.invokeFlushAfterService
设置为false。
@EnableHypermediaSupport
替换了
需求,和注册了一系列的bean使超文本易于构建。包括
LinkDiscoverers
与
ObjectMapper
的配置去编排成想要的结果信息。其
ObjectMapper
通过设置
spring.jackson.*
来进行个性化。
@EnableHypermediaSupport
来配置
HATEOAS’s配置。这种方式可以让
ObjectMapper
较早的使用。
@CrossOrigin
配置,不需要使用其他的任何的特殊的配置。可以通过自定义的
addCorsMappings(CorsRegistry)
注册方法注册
WebMvcConfigurer
bean,如下代码:
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}
@RestController
@RequestMapping("/users")
public class MyRestController {
@GetMapping("/{user}")
public Mono getUser(@PathVariable Long user) {
// ...
}
@GetMapping("/{user}/customers")
Flux getUserCustomers(@PathVariable Long user) {
// ...
}
@DeleteMapping("/{user}")
public Mono deleteUser(@PathVariable Long user) {
// ...
}
}
其功能性的变量“
WebFlux.fn”:将实际处理请求与路由配置进行分离。如下代码:
@Configuration
public class RoutingConfiguration {
@Bean
public RouterFunction monoRouterFunction(UserHandler userHandler) {
return route(GET("/{user}").and(accept(APPLICATION_JSON)), userHandler::getUser)
.andRoute(GET("/{user}/customers").and(accept(APPLICATION_JSON)), userHandler::getUserCustomers)
.andRoute(DELETE("/{user}").and(accept(APPLICATION_JSON)), userHandler::deleteUser);
}
}
@Component
public class UserHandler {
public Mono getUser(ServerRequest request) {
// ...
}
public Mono getUserCustomers(ServerRequest request) {
// ...
}
public Mono deleteUser(ServerRequest request) {
// ...
}
}
通用使用
spring-boot-starter-webflux
配置,可以添加webflux(注意:通过添加
spring-boot-starter-web
与
spring-boot-starter-webflux
将会导致webflux不会生效)。
HttpMessageReader
与 HttpMessageWriter
与实例 @EnableWebFlux
配置。
HttpMessageReader
与
HttpMessageWriter
转换器请求。他们通过用
CodecConfigurer
在类路径中配置。spring boot 通过使用
CodecCustomizer
实例。例如:
spring.jackson.*,配置主键被应用于
Jackson
中。如果想自定义转码为其,可以通过创建
CodecCustomizer
来处理:import org.springframework.boot.web.codec.CodecCustomizer;
@Configuration
public class MyConfiguration {
@Bean
public CodecCustomizer myCodecCustomizer() {
return codecConfigurer -> {
// ...
}
}
}
spring-boot-starter-jersey
。你需要一个
ResourceConfig
的类型的bean注册到所有的端点。如下代码:@Component
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(Endpoint.class);
}
}
你可以注册任意多的bean去实现多个高级化的配置。所有的注册的endpoints必须使用
@Components
,如下代码所示:@Component
@Path("/hello")
public class Endpoint {
@GET
public String message() {
return "Hello";
}
}
因为
Endpoint
是一个 spring
Endpoint
,其生命周期是被spring进行管理。可以使用自动注解
@Autowired
以及
@Value
去注入外部配置。默认
Jersey servlet被注册并且被mapping成为“/*”.可以在
ResourceConfig
中通过添加
@ApplicationPath
改变其mapping。
ServletRegistrationBean
的名字为
jerseyServletRegistration的
bean。默认,其servlet是lazily。你可以通过配置
spring.jersey.servlet.load-on-startup
改变其行为。你可以停用或者是通过定义相同的名字覆盖其配置。也可以通过设置
spring.jersey.type=filter
使用filter进行替换。
javax.servlet.ServletContainerInitializer
或者是
org.springframework.web.WebApplicationInitializer
接口。这减少地方包在运行一个war包范围内的情况下,会损坏spring boot。
org.springframework.boot.web.servlet.ServletContextInitializer
的bean。其启动方法提供了
ServletContext
的链接以及如果必要,能够被很容易实现已经存在的
WebApplicationInitializer的实现。
@WebServlet
,
@WebFilter
, 与
@WebListener自动完成扫描
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.stereotype.Component;
@Component
public class CustomizationBean implements WebServerFactoryCustomizer {
@Override
public void customize(ConfigurableServletWebServerFactory server) {
server.setPort(9000);
}
}
自定义话configuration目录,其代码如下:
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.setPort(9000);
factory.setSessionTimeout(10, TimeUnit.MINUTES);
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html"));
return factory;
}