:)????spring mvc 是前提
添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
-
這個(gè)start依賴的其他庫
配置信息
- 關(guān)于bean的配置在 WebMvcAutoConfiguration 這個(gè)類里面,這個(gè)類配置了很多bean纤掸,類似InternalResourceViewResolver仅孩, BeanNameViewResolver
- 添加一些其他的配置信息公浪,使用WebMvcConfigurer(這個(gè)接口提供了很多add方法)。
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("===> "+handler.toString());
return true;
}
});
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { }
@Override
public void addFormatters(FormatterRegistry registry) { }
}
HTTP請(qǐng)求格式化(request json > entity / response entity > json)
- spring boot 自動(dòng)配置了很多格式化請(qǐng)求參數(shù)的bean
- 自定義主要是注冊(cè)一個(gè)HttpMessageConverters的bean即碗,這個(gè)bean里面包含了多個(gè)HttpMessageConverter實(shí)例
@Configuration
public class MvcConfig {
@Bean
public HttpMessageConverters converters() {
return new HttpMessageConverters(new UserConverter());
}
}
靜態(tài)資源處理
-
默認(rèn)的靜態(tài)資源路徑映射到classpath的static目錄批狱,途中的index.html對(duì)應(yīng)的路徑是http://localhost:8080/index.html
修改默認(rèn)的映射路徑,注冊(cè)一個(gè)實(shí)現(xiàn)了WebMvcConfigurer接口的組件瘪菌,并重寫addResourceHandlers方法
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/*.html")
.addResourceLocations("classpath:/static/");
}
}
錯(cuò)誤處理
- @ControllerAdvice 這個(gè)注解只能捕獲controller的異常信息
@ControllerAdvice
public class ErrorHandler {
@ExceptionHandler(Exception.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);
}
}
- 如果請(qǐng)求還沒有到達(dá)controller就異常了许蓖,這個(gè)時(shí)候就只有用其他辦法了,spring boot會(huì)經(jīng)錯(cuò)誤信息映射到 /error 這個(gè)路徑 , 這個(gè)會(huì)更具produces屬性來返回不同的數(shù)據(jù)格式
@RestController
public class ErrorController implements org.springframework.boot.web.servlet.error.ErrorController {
private static final String PATH = "/error";
@Autowired
ErrorAttributes attributes;
@RequestMapping(value = PATH,produces = {MediaType.APPLICATION_JSON_VALUE})
public String eror(HttpServletRequest request, HttpServletResponse response){
return "error";
}
@Override
public String getErrorPath() {
return PATH;
}
}
?
End