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