如果它不是一个Web项目,Spring引导如何显式不加载一个类?

时间:2015-11-30 09:06:36

标签: spring-boot maven-3

一个独立的通用项目A,提供通用配置,里面有一个类

@RestController
public class CustomErrorController implements ErrorController {
    @Autowired
    private ErrorAttributes errorAttributes;
    //...
}

现在有另一个项目B依赖于上面的项目A,但这不是一个web项目只执行一些业务逻辑然后退出。所以在application.properties中我有这样的配置:

spring.main.web_environment=false

但是当运行项目B时,它失败了,因为这个例外:

No qualifying bean of type [org.springframework.boot.autoconfigure.web.ErrorAttributes] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

那么如何解决这个问题呢?可以在B的pom.xml中排除CustomErrorController,或者如果不是网络项目,则无法加载CustomErrorController

2 个答案:

答案 0 :(得分:0)

spring.main.web_environment=false禁用嵌入式容器,即使它存在于您的项目中。它不会执行黑魔法来防止您的类被实例化。

如果您正在使用组件扫描并且提供需要Web环境的类,则它将失败(如您所见)。也许您需要在几个模块中重构项目并将Web部件隔离在一个单独的项目中?

答案 1 :(得分:0)

排除CustomErrorController

@ComponentScan(basePackages = "com.foo",
excludeFilters = {@ComponentScan.Filter(value = ProjectAApplication.class,type = FilterType.ASSIGNABLE_TYPE),
                  @ComponentScan.Filter(value = CustomErrorController.class, type = FilterType.ASSIGNABLE_TYPE)})
@SpringBootApplication
public class ProjectBApplication implements CommandLineRunner {