目录
WebMVC配置
1、自定义消息转换器
2、自定义拦截器
3、自定义静态资源访问转发
全局异常处理
自定义Servlet组件、Filter过滤器和Listener监听器
Mybatis-Plus分页插件
开启指标监控
配置类
本文主要记录再spring boot项目中常用的一些配置
WebMVC配置
首先需要创建一个配置类标注@configuration注解,并注入WebMvcConfigure这个组件
@Configuration
public class MyConfig {
@Bean
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer() {
}
}
}
1、自定义消息转换器
先编写一个实体类User和一个自定义消息转换器实现HttpMessageConverte
@Data
public class User {
private String id;
private String userName;
private String sex;
private String birth;
}
public class MyMessageConverter implements HttpMessageConverter{ @Override public boolean canRead(Class> aClass, MediaType mediaType) { return false; } @Override public boolean canWrite(Class> aClass, MediaType mediaType) { // 如果传入的是User对象就可以写 return aClass.isAssignableFrom(User.class); } // 服务器要统计所有的MessageConverters支持的内容类型 canWrite返回true就会进入该方法 @Override public List getSupportedMediaTypes() { return MediaType.parseMediaTypes("application/lzz-mc"); } @Override public User read(Class extends User> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException { return null; } // 自定义协议数据的写出 User对象的属性-->User对象属性的值 @Override public void write(User user, MediaType mediaType, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException { Field[] fields = user.getClass().getDeclaredFields(); StringBuilder stringBuilder = new StringBuilder(); for (Field field : fields) { field.setAccessible(true); String name = field.getName(); try { Object o = field.get(user); stringBuilder.append(name).append(" --> ").append(o.toString()).append("n"); } catch (IllegalAccessException e) { e.printStackTrace(); } } OutputStream body = httpOutputMessage.getBody(); body.write(stringBuilder.toString().getBytes()); } }
在配置类中添加这个自定义消息转换器
@Override public void extendMessageConverters(List> converters) { converters.add(new MyMessageConverter()); }
此时测试时在controller中编写一个根据id获取user的请求,返回user对象,其中controller需要标注@RestController注解
@GetMapping("user/{id}")
public User get(@PathVariable String id){
User user = new User();
user.setId(id);
user.setUserName("liuzhuzheng");
user.setSex("boy");
user.setBirth("1999-12-03");
return user;
}
用postman测试 更改accept接收的返回数据格式为我们自定义的内容类型 返回结果就会进入我们自定义的消息转换器调用write方法输出 其中的原理用到了springboot的内容协商
如果需要在网页上调用请求 需要在yml文件中进行如下设置
spring:
mvc:
contentnegotiation:
favor-parameter: true #开启请求参数内容协商模式 通过在queryString上添加format字段
并在配置文件中添加内容协商配置
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
// 指定参数对应的媒体类型
Map mediaTypes = new HashMap<>();
mediaTypes.put("json",MediaType.APPLICATION_JSON);
mediaTypes.put("xml",MediaType.APPLICATION_XML);
mediaTypes.put("lzz",MediaType.parseMediaType("application/lzz-mc"));
// 设置参数内容协商策略
ParameterContentNegotiationStrategy parameterContentNegotiationStrategy = new ParameterContentNegotiationStrategy(mediaTypes);
// 设置参数名 默认format
parameterContentNegotiationStrategy.setParameterName("type");
// 设置请求头内容协商策略
HeaderContentNegotiationStrategy headerContentNegotiationStrategy = new HeaderContentNegotiationStrategy();
configurer.strategies(Arrays.asList(parameterContentNegotiationStrategy,headerContentNegotiationStrategy));
}
最终测试如下
2、自定义拦截器
先创建拦截器类实现HandleInterceptor
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
在配置类中添加拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/sta
@ControllerAdvice
public class GlobalExceptionHandle {
@ExceptionHandler({ArithmeticException.class,NullPointerException.class})
public String globalHandleException(Exception e){
return "我的异常处理";
}
}
自定义Servlet组件、Filter过滤器和Listener监听器
创建自定义servlet类实现HttpServlet
@WebServlet(urlPatterns = "/servlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("myServlet");
//super.doGet(req, resp);
}
// @Override
// protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doPost(req, resp);
// }
}
创建自定义filter实现FIlter
@WebFilter(urlPatterns = "/filter")
@Slf4j
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("myFilter初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("myFilter工作中");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
log.info("myFilter已销毁");
}
}
创建自定义listener实现ServletContextListener
@WebListener
@Slf4j
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
log.info("listener初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
log.info("listener已销毁");
}
}
配置类中注册这些组件
@Bean
public ServletRegistrationBean myServlet(){
MyServlet myServlet = new MyServlet();
return new ServletRegistrationBean<>(myServlet,"/servlet","/myServlet");
}
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(new MyFilter());
filterRegistrationBean.addUrlPatterns("/filter","/myFilter");
return filterRegistrationBean;
}
@Bean
public ServletListenerRegistrationBean myListener(){
MyListener myListener = new MyListener();
return new ServletListenerRegistrationBean<>(myListener);
}
Mybatis-Plus分页插件
前提是在使用mybatis-plus,并引入了依赖
com.baomidou mybatis-plus-boot-starter3.4.3
配置类中添加
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
paginationInnerInterceptor.setDbType(DbType.H2);
paginationInnerInterceptor.setOverflow(true);
paginationInnerInterceptor.setMaxLimit(200L);
mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
return mybatisPlusInterceptor;
}
开启指标监控
前提是引入了依赖进行指标监控
org.springframework.boot spring-boot-starter-actuator
在yml文件中进行配置
management:
endpoints:
web:
exposure:
include: '*' #开启所有endpoint可通过web方式访问
endpoint:
health:
show-details: always #展示health监控状态详细信息
浏览器测试,都是以http://localhost:8080/actuator/开头,后面接具体的指标
配置类
整个配置类的内容如下
package com.example.demo.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.example.demo.config.converter.MyMessageConverter;
import com.example.demo.config.interceptor.MyInterceptor;
import com.example.demo.config.servlet.MyFilter;
import com.example.demo.config.servlet.MyListener;
import com.example.demo.config.servlet.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.accept.HeaderContentNegotiationStrategy;
import org.springframework.web.accept.ParameterContentNegotiationStrategy;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Configuration
public class MyConfig {
@Bean
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer() {
@Override
public void extendMessageConverters(List> converters) {
converters.add(new MyMessageConverter());
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
// 指定参数对应的媒体类型
Map mediaTypes = new HashMap<>();
mediaTypes.put("json",MediaType.APPLICATION_JSON);
mediaTypes.put("xml",MediaType.APPLICATION_XML);
mediaTypes.put("lzz",MediaType.parseMediaType("application/lzz-mc"));
// 设置参数内容协商策略
ParameterContentNegotiationStrategy parameterContentNegotiationStrategy = new ParameterContentNegotiationStrategy(mediaTypes);
// 设置参数名 默认format
parameterContentNegotiationStrategy.setParameterName("type");
// 设置请求头内容协商策略
HeaderContentNegotiationStrategy headerContentNegotiationStrategy = new HeaderContentNegotiationStrategy();
configurer.strategies(Arrays.asList(parameterContentNegotiationStrategy,headerContentNegotiationStrategy));
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/sta
@Bean
public ServletRegistrationBean myServlet(){
MyServlet myServlet = new MyServlet();
return new ServletRegistrationBean<>(myServlet,"/servlet","/myServlet");
}
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(new MyFilter());
filterRegistrationBean.addUrlPatterns("/filter","/myFilter");
return filterRegistrationBean;
}
@Bean
public ServletListenerRegistrationBean myListener(){
MyListener myListener = new MyListener();
return new ServletListenerRegistrationBean<>(myListener);
}
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
paginationInnerInterceptor.setDbType(DbType.H2);
paginationInnerInterceptor.setOverflow(true);
paginationInnerInterceptor.setMaxLimit(200L);
mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
return mybatisPlusInterceptor;
}
}



