当前位置: 首页 > 知识库问答 >
问题:

禁止@ComponentScan的冲突

颛孙喜
2023-03-14

我有一个Spring项目,其中多个bean可能具有相同的bean名称。

为了避免冲突BeanDefinitionException,项目有一个重写的ContextNamespaceHandler。

public class ContextNamespaceHandler extends NamespaceHandlerSupport {

    @Override
    public void init() {
        registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser() {
            @Override
            protected ClassPathBeanDefinitionScanner createScanner(XmlReaderContext readerContext, boolean useDefaultFilters) {
                return new ClassPathBeanDefinitionScanner(readerContext.getRegistry(), useDefaultFilters) {
                    @Override
                    protected boolean checkCandidate(String beanName, BeanDefinition beanDefinition) throws IllegalStateException {
                        return true;
                    }
                };
            }
        });
    }

}

我正在使用Swagger/Springfox为项目生成API文档。

@Configuration
@EnableWebMvc
@EnableSwagger2
@ComponentScan(basePackages = { "some.package", "some.other.package" })
public class SwaggerConfig {
   // ...
}

组件扫描(ComponentScan)导致冲突BeanDefinitionException(BeanDefinitionException),因为它使用的是默认的路径BeanDefinitionScanner(而不是重写的)。

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'xxx' for bean class [xxx] conflicts with existing, non-compatible bean definition of same name and class [xxx]
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:320)
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:259)
    at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:140)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:262)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:226)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:193)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:163)
    ... 22 more

是否有方法重写组件扫描所使用的类路径BeanDefinitionScanner,或以其他方式抑制冲突BeanDefinitionException?

共有1个答案

鱼意远
2023-03-14

这里最好的方法通常是通过在注释中指定bean名称来使每个bean名称唯一,即:

@Service("someService")

现在,您可以指定自动关联时要使用的bean的名称:

@Autowired
@Qualifier("someService")

即使存在泛型对象的重写组件,也最好指定一个名称以明确区分。抑制异常通常被认为是不好的做法。希望这有帮助!

 类似资料:
  • 一、功能说明 本功能为设置禁止登陆后台的IP地址,支持通配符 二、子功能导航 1.添加IP 2.管理IP 三、功能详解 1.添加IP 1).如何进入本功能 导航栏 选择扩展 -> 菜单栏 选择IP禁止 2).界面解释 进入后选择添加IP禁止按钮弹出如下界面 界面详述 1). IP: 填写您欲禁止进入后台的IP,支持通配符,如图所示将会阻止:127.0.0.0~127.0.0.255 之间的IP登陆

  • 我对这个被禁止的问题感到困惑。首先,我查看了相关的stackoverflow帖子,并在谷歌上搜索了足够多,但仍然不知道。 项目详细信息: HTML Instagram.php form_open()函数为访问令牌生成隐藏字段,并将其包含在ajax发布数据中。 JavaScript AdminScript.js 控制器 admin.php 当我使csrf保护状态为假时,它们都能正常工作。或者当我将p

  • 请求header POST /v1/activity/{频道id}/comments/{观众id}/mute Authorization:Bearer {ACCESS TOKEN} Content-Type:application/json 注: 请将上方的{ACCESS TOKEN}替换为您的ACCESS TOKEN 请将"{频道id}"替换为您的频道id 请将"{观众id}"替换为您想要禁言

  • 问题内容: 默认情况下,Python的解释器是否启用输出缓冲? 如果答案是肯定的,那么有什么方法可以禁用它? 到目前为止的建议: 使用命令行开关 包装每次写入后刷新的对象 设置环境变量 还有其他方法可以在执行过程中以编程方式在中设置一些全局标志吗? 问题答案: 你可以使用”python -u”()或通过设置环境变量PYTHONUNBUFFERED来跳过整个python进程的缓冲。 你还可以将替换为

  • 问题内容: 在抓取https://www.netflix.com之类的网站时,被robots.txt禁止:https://www.netflix.com/> 错误:未下载以下响应:https : //www.netflix.com/ 问题答案: 在2016年5月11日发布的新版本(scrapy 1.1)中,抓取功能先在抓取之前下载了robots.txt。要更改此行为,请使用ROBOTSTXT_OB

  • 你好,我对上面的代码有一个问题。我从一个网站上得到的。它返回$缓冲区,服务器理解请求,但被禁止。