weld-exclude应用程序范围的bean from scanning/beans.xml

envsm3lx  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(396)

我有以下@applicationscoped bean:

@ApplicationScoped
public class ServiceProducer {

    private static final Logger logger = LoggerFactory.getLogger(ServiceProducer.class);

    @Default
    @Produces
    @PersistenceContext(unitName = "nemo")
    private EntityManager nemoEntityManager;

    private CacheManager cacheManager;

    @PostConstruct
    void init() {
        try {
            cacheManager = Caching.getCachingProvider().getCacheManager(
                    Objects.requireNonNull(Thread.currentThread().getContextClassLoader().getResource("/ehcache.xml")).toURI(),
                    Thread.currentThread().getContextClassLoader());
        } catch (URISyntaxException e) {
            logger.error(e.getMessage());
        }

    }

    @Produces
    public CacheManager produceCacheManager() {
        return cacheManager;
    }

上面的类包含在我的web应用程序的公共/共享模块中。这对生产是好的,但是我需要一个集成测试的替代方案,这是用wildspike集成cucumber完成的。
不幸的是,通过配置beans.xml,我无法禁用上面的bean,我尝试通过以下方式配置beans.xml:

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://xmlns.jcp.org/xml/ns/javaee
    http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all">

    <scan>
        <exclude name="it.myapp.ecommerce.commons.resource.ServiceProducer"></exclude>
    </scan>

然而,一切都没有改变。是因为类属于依赖关系吗?

neekobn8

neekobn81#

你基本上有两个选择。
首先,这是通常的去推荐选项,它是 @Alternative@Priority 在您声明的辅助bean上的组合,并且只在测试环境中添加。这样,它将被用于测试,而不是在生产中。请注意,您必须只在测试环境中添加备选方案,否则它将一直被选中。例如,您可以直接在测试项目(或其源代码)下声明这个bean,以便主(生产)jar不包含它。此外,你不需要改变 beans.xml 实现上述目标。备选方案可以通过 @Priority 或通过 beans.xml ; 前者是全局的,后者是每个bean的存档。
第二种选择是cdi扩展,它将观察 ProcessAnnotatedType<ServiceProducer> 事件与意志 veto() 合适的班级。这意味着给定的类将不会被当作bean。这可以有条件地根据某些参数或手头的任何其他参数来完成。如果您执行了上述操作,那么您需要以某种方式添加的新测试实现 ServiceProducer . 您可以再次通过在测试源中声明它来实现这一点(这里不需要替代),但是您也可以使用相同的扩展在中注册合成bean AfterBeanDiscovery 通过 BeanConfigurator spi公司。
虽然cdi扩展非常强大,但我建议您在阅读了一些关于替代方案及其实现的工作原理之后,使用第一个更简单、更容易理解的选项。

相关问题