1

我想创建一个生产者来动态选择我的 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 上产生。我找不到可能导致它的原因。

4

3 回答 3

2

在 CDI 生产者中支持注入。由于您的类UsuarioHandler既是生产者又是注入目标,因此堆栈溢出是预期的结果。想一想:

  1. AfterUsuarioHandler被实例化为托管bean,@Preferred Hello hello需要注入。
  2. @Preferred Hello hello然后实例化需求的生产者,也是你的UsuarioHandler.
  3. @Preferred Hello hello但是生产者本身也需要注入的实例。
  4. 所以另一个生产者被实例化,等等。

由于您的解决方案UsuarioHandler@Default,容器不会代理它,因此每次需要时创建一个新实例,作为生产者或托管 bean。

于 2013-03-07T16:58:16.157 回答
1

使您的生产者方法“getHello”静态(甚至可以是私有的)并将 Usuario 作为参数传递。

@Produces
@Preferred
private static  Hello getHello(@New HelloBanned ban,
                      @New HelloCoolGuy cool, Usuario usuario){
    if (usuario.isBannedFlag()){
       return ban;
    }
    return cool;
}
于 2013-03-07T20:35:46.350 回答
0

我发现 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

如果这不是问题,请粘贴到您的堆栈跟踪中,以便我们查看您遇到的错误是什么。

于 2013-03-05T07:59:06.907 回答