Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >允许Spring在不同的jars中有多个WebMvcConfigurer实现

允许Spring在不同的jars中有多个WebMvcConfigurer实现
EN

Stack Overflow用户
提问于 2019-05-19 23:31:26
回答 2查看 4.2K关注 0票数 3

当使用Spring时,在本例中是rest端点&使用Spring 2,我可以通过实现WebMvcConfigurer接口为我的应用程序配置拦截器:

代码语言:javascript
运行
AI代码解释
复制
@Configuration
public class SpringWebConfig implements WebMvcConfigurer
{
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor).addPathPatterns("/api/endpoint/**");
    }
}

通过以下操作,我自动地将这个拦截器添加到我的大多数应用程序中:

  1. 创建一个“公共jar”,并将上面的接口放在包下。 com.company.api
  2. 在每个应用程序中,将包com.company.api添加到api扫描中。

这个公共包还包含拦截器和实用程序类,以使该拦截器工作,因此实际上,添加这个公共jar将自动将他拦截器添加到应用程序中的所有操作中,这与Spring本身所做的类似:添加依赖项会改变Spring的默认配置。

我现在面临的问题是,这种方法不能扩展到第二个jar中的第二个拦截器,因为我已经使用了WebMvcConfigurer实现。我不能有两个。

我正在考虑可能使用某种组合配置模式,在这种模式中,我们遍历每个配置程序,收集所有拦截器,然后添加它们一次,但不幸的是Spring不允许这样做。我有什么选择?

目前,我采用的方法是在每一个需要它的应用程序中复制WebMvcConfigurer接口。当事情发生变化时,我感到很难过,我必须在每个应用程序中更改相同的代码片段。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-01 05:33:09

如果我正确理解您的问题,基本上您希望在多个JAR中定义一些常见的Interceptors,这样应用程序就可以通过简单地将这些JAR包含到应用程序中来激活这些Interceptors

我正在考虑可能使用某种组合配置模式,在这种模式中,我们遍历每个配置程序,收集所有拦截器,然后添加它们一次,但不幸的是Spring不允许这样做。我有什么选择? 那么,如果实现A返回只有拦截器A的注册表,而实现B返回只有拦截器B的注册表,那么spring会将两个注册中心合并成一个同时包含A和B的超级注册表,还是只选择一个,还是抛出没有唯一bean定义的错误?

实际上,Spring已经实现了这一特征。当存在多个WebMvcConfigurer bean时,Spring只需调用它们的配置方法把它们一个一个地循环起来即可。因此最终的结果是InterceptorRegistry将包含所有的拦截器.

如果客户端应用程序只需要激活某些WebMvcConfigurer,它就可以简单地排除那些包含它们不需要的WebMvcConfigurer的JAR。

为了进一步实现这个想法,允许应用程序控制哪个Interceptors被激活到拦截器级别,您甚至可以在每个常见的JAR中执行以下操作:

代码语言:javascript
运行
AI代码解释
复制
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {

    //Make sure the HandlerInterceptor implementation in this JAR is a bean (e.g mark it as @Component)
    @Autowired
    private List<HandlerInterceptor> interceptors;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        for(HandlerInterceptor interceptor : interceptors){
            registry.addInterceptor(interceptor).addPathPatterns("/api/endpoint/**");
        }
    }
}

在客户端应用程序中,使用includeFilters / excludeFilters@ComponentScan中自定义要包含哪些拦截器。例如,要禁用某些Interceptors,可以这样做:

代码语言:javascript
运行
AI代码解释
复制
@ComponentScan(
    basePackages = {"com.company.api"},
    excludeFilters={
         @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=com.company.common.jar1.Inteceptor1.class) ,
         @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=com.company.common.jar2.Inteceptor1.class)
    })
票数 7
EN

Stack Overflow用户

发布于 2019-05-31 02:42:05

如果我正确理解了您的问题,您不希望在每个应用程序中实现WebMvcConfigurer的所有方法。您只想添加相关的拦截器并完成它。

我的方法是通过在AbstractWebMvcConfigurerImpl模块中实现WebMvcConfigurer来创建Common。只需保留addInterceptors()抽象并实现其他方法即可。然后,您可以在每个Spring项目中扩展该抽象实现,并根据需要重写addInterceptors()方法。

此外,您可以在Spring项目中拥有任意数量的WebMvcConfigurer实现。因此,如果需要在Common模块中定义一些公共拦截器,也可以在公共模块中扩展AbstractWebMvcConfigurerImpl

请注意,您所有的AbstractWebMvcConfigurerImpl实现都应该使用@Configuration进行注释。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56216178

复制
相关文章
Spring Batch 可以在一个 Step 中有多个 Tasklet 吗
根据 Spring Batch 的设计,在一个 Step 中只能执行一个 Tasklet。
HoneyMoose
2022/10/15
1.5K0
Spring Batch 可以在一个 Step 中有多个 Tasklet 吗
Spring框架中有哪些不同类型的事件
如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知。 
红目香薰
2022/11/29
3560
Spring Boot 配置接口 WebMvcConfigurer
WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制 基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer 接口 WebMvcConfigurerAdapter 抽象类是对WebMvcConfigurer接口的简单抽象(增加了一些默认实现),但在在SpringBoot2.0及Spring5.0中WebMvcConfigurerAdapter已被废弃 。 官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport
JavaEdge
2019/03/05
6.9K0
经典面试题-Spring框架中有哪些不同类型的事件?
Spring的ApplicationContext 提供了支持事件和代码中监听器的功能。 我们可以创建bean用来监听在ApplicationContext 中发布的事件。ApplicationEvent类和在ApplicationContext接口中处理的事件,如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知。
cwl_java
2019/11/05
1.8K0
微服务架构Day03-SpringBoot之web开发配置
概述 SpringBoot开发: 1.创建SpringBoot应用,选中需要的场景模块。 2.SpringBoot已经默认将场景模块配置好,只需要在配置文件中指定少量的配置(数据库地址,用户名,密码)就可以运行起来。 3.只需要编写业务逻辑代码。 需要掌握自动配置原理:这个场景中SpringBoot默认配置好了什么,能不能修改,能修改哪些配置,能不能扩展。 XxxAutoConfiguration:帮我们给容器中自动配置组件 XxxProperties:配置类,封装配置文件中的内容 SpringBoo
攻城狮Chova
2022/01/22
9170
WebMvcConfigurer,有点东西
从本质上来看,Bean 之所以拥有高可扩展性,这主要得益于@Import、@Conditional 和 Callback Interface。@Import 注解为 Bean 带来了灵活的可插拔机制,比如众多的 EnableXXX 注解;@Conditional 注解为 Bean 带来了条件化的激活机制,比如 @ConditionalOnMissingBean 注解;Callback Interface 为 Bean 带来了灵活的定制化机制,比如 BeanPostProcessor、WebMvcConfigurer 等。
程序猿杜小头
2023/09/02
2100
WebMvcConfigurer,有点东西
MySQL允许在唯一索引字段中添加多个NULL值
我们可以看出,此约束不适用于除BDB存储引擎之外的空值。对于其他引擎,唯一索引允许包含空值的列有多个空值。
Java那些事儿
2020/07/21
10.2K0
MySQL允许在唯一索引字段中添加多个NULL值
MySQL数据库中有哪些不同的表格?
在 MySQL 中,数据表是一个或多个字段的集合(有组织排列),并且每个字段可以存储特定的类型数据。常见的 MySQL 表格有以下几种:
用户1289394
2023/08/22
3220
MySQL数据库中有哪些不同的表格?
Spring读取mybatis在多个jar包下的的mapper文件
刚开始的时候我的配置文件在同名目录下都是在/mapper下,导致只能读取一个jar中的mapper文件。先解决如下: 1.将mapper文件放在不能放在同名的目录下。        比如:user.jar放在/user下,common.jar放在common下 2.在Spring中配置  (记住:classpath后跟*号) <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">     <property name="mapperLocations">        <array>            <value>classpath*:user/*.xml</value>            <value>classpath*:common/*.xml</value>        </array>     </property>
似水的流年
2019/12/06
1.9K0
Spring Security 实战干货:如何实现不同的接口不同的安全策略
欢迎阅读 Spring Security 实战干货 系列文章 。最近有开发小伙伴提了一个有趣的问题。他正在做一个项目,涉及两种风格,一种是给小程序出接口,安全上使用无状态的JWT Token;另一种是管理后台使用的是Freemarker,也就是前后端不分离的Session机制。用Spring Security该怎么办?
码农小胖哥
2020/06/12
1.7K0
自定义SpringBoot默认MVC配置?好几个坑,这篇文章必须珍藏
前些天,在项目实践过程中出现了一个奇怪的状况,Spring Boot的参数绑定失效了。而起因只是因为同事把参数上的@RequestParam注解去掉了。我们都知道,如果参数名称和Controller的方法名相同时,根本不需要@RequestParam注解的,Spring Boot会自动帮我们完成参数的绑定。但为什么自动绑定机制失效了呢?本篇文章会为大家揭开谜底,在此过程中也会全面讲解如何在Spring Boot项目中自定义配置WebMvc,以及这其中的很多坑。
程序新视界
2021/01/18
4.2K1
Java如何解决跨域问题
跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略。
Vincent-yuan
2021/10/13
1.9K0
ios开发-Storyboard在多个viewcontroller之间导航的实现
IOS SDK6/Xcode4.5开始在Storyboad中新增很多功能对可视化的开发页面布局,导航更加方便,下面就写一下各种导航的实现。 1、不用像Xcode4之前必须删除默认的viewcontro
阿新
2018/04/12
1.8K0
ios开发-Storyboard在多个viewcontroller之间导航的实现
@DependsOn & 控制多个(不同)的@Bean的加载顺序
我们都知道多个Bean加载是按照代码顺序来的。BeanA下载BeanB前面,那么BeanA是会有在BeanB前面示例化的。
收心
2022/11/14
7770
在IDEA启动多个Spring Boot工程实例的简单方法
有时候为了自测需要,springboot需要启动多个端口不同应用相同的项目,这时IDEA 就能帮我们简单的实现。本人由于在学习springcloud的Eureka,所以用到了Springboot多实例。 1、点击IDEA右上角的Edit Configurations,如图
一诺千金
2020/04/30
1.3K0
Spring Boot 解决跨域问题的 3 种方案!
前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看。
Java技术江湖
2021/01/06
6300
Spring Boot 解决跨域问题的 3 种方案!
前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看。Java面试宝典PDF完整版
程序员白楠楠
2021/01/28
1.2K0
Spring Boot 解决跨域问题的 3 种方案!
前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看。
肉眼品世界
2021/01/06
7020
点击加载更多

相似问题

什么时候实现WebMvcConfigurer来配置Spring?

11

在实现WebMvcConfigurer时保留一些Spring默认配置

11

WebMvcConfigurer在spring boot中不能工作吗?

17

为什么我在类路径中有不同版本的Kotlin JARs?

12

Webflux + spring本机安全性- NoClassDefFoundError: WebMvcConfigurer

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文