Spring Boot-全局化的特性

本文详细介绍如何使用WebMvcConfigurer接口全局配置SpringBoot的MVC特性,包括自定义拦截器、日期格式化、跨域访问、视图映射、JSON序列化及静态资源配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文的核心内容:使用WebMvcConfigurer来全局定制SpringBoot的MVC特性。如拦截器,跨域访问,日期格式化,URI到视图的映射,JSON格式转化器(FastJson代替Spring Boot集成的Jackson作为Json的序列化工具),静态资源的配置。


我们可以通过实现WebMvcConfigurer接口来配置应用的MVC全局特性。【相当于我们之前使用SpringMVC把这些配置写到xxx-mvc.xml中一致】

注意:我们也可以通过继承 WebMvcConfigurationSupport类,重写这些方法。但是当我们继承 WebMvcConfigurationSupport类,SpringBoot的mvc自动配置会失效。

在 springboot的web自动配置类 WebMvcAutoConfiguration 上有一个条件注解 。

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

这个注解的意思是在项目类路径中 缺少 WebMvcConfigurationSupport类型的bean时改自动配置类才会生效,所以继承 WebMvcConfigurationSupport 后需要自己再重写相应的方法。

 


import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;
//@Configuration 配置全局化特性  表示这是一段SpringBoot的配置文件
@Configuration
public class MvcConfigurer implements WebMvcConfigurer {

    //格式化
    @Override
    public void addFormatters(FormatterRegistry registry) {
       
    }

    //拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       
    }
    //跨域访问设置
    @Override
    public void addCorsMappings(CorsRegistry registry) {
    
    }
    //添加URI到视图的映射
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
    
    }
    //格式转换器
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

    }
    //静态资源配置
    @Override
     public void addResourceHandlers(ResourceHandlerRegistry registry){

        super.addResourceHandlers(registry);
     }

}

 

一:拦截器

拦截器需要实现HandlerInterceptor接口,并且注册到框架的拦截链中。

自定义拦截器

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor  implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //拦截请求  逻辑处理
        //若请求继续,返回值true;中断请求,返回值False。
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //Controller方法处理完毕后,调用此方法。
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //页面渲染完调用此方法
    }
}

将自定义拦截器增加到拦截链中。

     //拦截器  拦截所有以/ajax/XXX  为路径的请求。
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/ajax/**");
    }

 

二:日期格式化处理

对于日期类型的参数,Spring默认没有配置如何将字符串转为日期类型。为了格式化日期,需要添加一个DateFormatter类。

 //格式化
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss"));
    }

 

三:跨域访问

出于安全考虑,浏览器回禁止AJAX访问不同域的地址。

W3C的CORS规范,允许实现跨域访问,并被大多数浏览器支持。

SpringBoot提供了对CORS的支持,可以实现addCorsMapping接口来添加特定的配置:

   //跨域访问设置
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //允许所有跨域访问,或者控制的更加细致。
        registry.addMapping("/**");
    }

 

四:注册Controller

有时,我们没有必要为一个URL指定一个Controller方法,可以直接将URI请求转到对模版的渲染上。

 //添加URI到视图的映射
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/index").setViewName("/index.ftl");
        registry.addRedirectViewController("/**/*.do","/index");
    }

对于/index请求,返回的视图为index.ftl。

所有以/xx/.do结尾的请求重定向到/index

 

五:格式化转化器【FastJson代替Jackson进行序列化】

引入FastJson的Maven依赖

         <!--FastJson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.31</version>
        </dependency>
   //格式转换器
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 1. 创建json转换器
        FastJsonHttpMessageConverter messageConverter = new FastJsonHttpMessageConverter();
        // 2. 处理中文乱码
        ArrayList<MediaType> mediaTypes = new ArrayList<MediaType>();
        mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        messageConverter.setSupportedMediaTypes(mediaTypes);
        // 3. 配置转换器
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(SerializerFeature.PrettyFormat); // 优雅的json格式
        messageConverter.setFastJsonConfig(config);
        // 4. 添加转换器
        converters.add(messageConverter);
    }

 

六:静态资源的配置

   @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        if(!registry.hasMappingForPattern("/static/**")){
            registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        }
        super.addResourceHandlers(registry);
    }

 

### 使用 `spring-boot-starter-jndi` 启动器 在 Spring Boot 项目中,`spring-boot-starter-jndi` 是用于简 JNDI(Java Naming and Directory Interface)集成的一个启动器。它允许开发者通过简单的配置来访问外部资源,比如数据库连接池或其他企业级服务。 #### 添加依赖项 为了使用 `spring-boot-starter-jndi`,需要将其作为依赖项添加到项目的构建文件中。对于 Maven 和 Gradle 的配置如下: ##### Maven 配置 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jndi</artifactId> </dependency> ``` ##### Gradle 配置 ```gradle implementation 'org.springframework.boot:spring-boot-starter-jndi' ``` 以上代码片段展示了如何将 `spring-boot-starter-jndi` 添加到项目中的方式[^1]。 #### 配置 JNDI 数据源 Spring Boot 提供了一种自动的机制来绑定 JNDI 资源。通常情况下,JNDI 数据源可以通过应用程序属性文件 (`application.properties`) 或环境变量进行定义。以下是常见的配置选项: ```properties spring.datasource.jndi-name=java:comp/env/jdbc/MyDataSource ``` 此配置指定了数据源的 JNDI 查找名称。当 Spring Boot 应用程序启动时,会尝试根据指定的 JNDI 名称加载相应的数据源实例[^3]。 如果使用的容器支持特定的 JNDI 实现,则可能还需要额外的配置步骤。例如,在 Tomcat 中可以这样声明全局上下文的数据源: ```xml <Resource name="jdbc/MyDataSource" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="dbuser" password="s3cret" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb"/> ``` 这段 XML 片段显示了如何在 Tomcat 容器中配置一个名为 `jdbc/MyDataSource` 的 JNDI 数据源[^2]。 #### 自定义 Bean 注入 除了自动配置外,还可以手动注入 JNDI 对象。这可以通过编写自定义的配置类实现: ```java import javax.naming.InitialContext; import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class DataSourceConfig { @Bean(destroyMethod="") public DataSource dataSource() throws Exception { InitialContext ctx = new InitialContext(); return (DataSource)ctx.lookup("java:comp/env/jdbc/MyDataSource"); } } ``` 在此示例中,我们创建了一个名为 `dataSource()` 的方法,并利用 `InitialContext` 来执行具体的 JNDI 查询操作[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值