[英]CDI Producer causes stackoverflow
我想创建一个生产者来动态选择我的Interface Hello的实现。
public interface Hello extends Serializable{
public String sayHello();
}
你好Impls:
public class HelloBanned implements Hello{
@Override
public String sayHello() {
return "Get out!!!";
}
}
public class HelloCoolGuy implements Hello{
@Override
public String sayHello() {
return "Welcome";
}
}
我的sessionBean,我想要生产者方法:
public class UsuarioHandler implements Serializable{
@Inject
private Usuario usuario;
@Inject
@Preferred
Hello hello;
@EJB
UsuarioBeanLocal userEJB;
public String login(){
usuario.setId(2L);
return userEJB.efetuarLogin(usuario);
}
@Produces
@Preferred
public Hello getHello(@New HelloBanned ban,
@New HelloCoolGuy cool){
if (usuario.isBannedFlag()){
return ban;
}
return cool;
}
}
此代码生成StackOverFlow。 我找不到可能导致它的原因。
在CDI生产者支持注射。 因为,您的类UsuarioHandler
既是生产者又是注入目标,因此堆栈溢出是预期的结果。 想一想:
UsuarioHandler
实例化为托管bean后,需要注入@Preferred Hello hello
。 @Preferred Hello hello
的生产者需要实例化,也就是你的UsuarioHandler
。 @Preferred Hello hello
的实例。 由于您对UsuarioHandler
的处理是@Default
,因此容器不代理它,因此每次需要时都会创建一个新实例,作为生产者或托管bean。
使您的Producer方法“getHello”静态(甚至可以是私有的)并将Usuario作为参数传递。
@Produces
@Preferred
private static Hello getHello(@New HelloBanned ban,
@New HelloCoolGuy cool, Usuario usuario){
if (usuario.isBannedFlag()){
return ban;
}
return cool;
}
我发现CDI在项目中不起作用的最常见问题是缺少CDI的XML bean描述符。 将beans.xml添加到META-INF / beans.xml或WEB-INF / beans.xml中
描述符可以是空的,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
要了解有关beans.xml文件的更多信息,请参阅此链接: http : //www.seamframework.org/Documentation/WhatIsBeansxmlAndWhyDoINeedIt
如果这不是问题,那么请粘贴到堆栈跟踪中,这样我们就能看到你得到的错误是什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.