栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Boot 常用配置

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Boot 常用配置

目录

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 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-starter
            3.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;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/630953.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号