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. UsuarioHandlerマネージド Bean としてインスタンス化された後、@Preferred Hello hello注入する必要があります。
  2. @Preferred Hello hello次に、インスタンス化されたニーズのプロデューサー、またあなたのUsuarioHandler.
  3. @Preferred Hello helloただし、プロデューサー自体にも、注入されたインスタンスが必要です。
  4. したがって、別のプロデューサーがインスタンス化されます。

あなたの対処UsuarioHandlerはであるため@Default、コンテナーはそれをプロキシしません。したがって、プロデューサーまたはマネージド Bean として、必要になるたびに新しいインスタンスを作成します。

于 2013-03-07T16:58:16.157 に答える
1

Producer Method "getHello" を static (private にすることも可能) にして、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 に答える