1

私はJAX-WSを使ったプロジェクトに取り組んでいます。

私はこのようにする必要があります。(それが可能かどうかさえ私にはわかりません)

このような EJB が 3 つあるとします。

public abstract class AbstractEjb<T extends A>

@Stateless
@LocalBean
public class ConcreteEjbB extends AbstractEjb<B>

@Stateless
@LocalBean
public class ConcreteEjbC extends AbstractEjb<C>

現在、私のエンドポイントは次のようになっています

@WebService
public class ConcretEndpointB {

    @Ejb private ConcretEjbB;
}

@WebService
public class ConcretEndpointC {

    @Ejb private ConcretEjbC;
}

私はこのようにすることができますか?

public class AbstractEndpoint<T extends A> {

    public AbstractEndpoint(final Class<T> ejbType) {
        super();
        this.ejbType = ejbType;
    }

    @WebMethod
    public String echo(@WebParam final String message) {

        //return ejb.echo(message); // :(

        // now can I look up the actual ejb instance with 'ejbType'?

        lookup(ejbType).echo(message);
    }

    private final Class<T> ejbType;

    @EJB protected AbstractEjb<T> ejb; // I don't think this gonna work.
}

@WebService
public class ConcretEndpointB extends AbstractEndpoint<B> {

    public ConcreteEndpointB() {
        super(ConcreteEjbB.class);
    }

    //public String echo(final String message) {
    //    return ejbB.echo(message);
    //}

    //@Ejb private ConcretEjbB ejbB;
}

@WebService
public class ConcretEndpointC extends AbstractEndpoint<C> {

    public ConcreteEndpointC() {
        super(ConcreteEjbC.class);
    }

    //public String echo(final String message) {
    //    return ejbC.echo(message);
    //}

    //@Ejb private ConcretEjbC ejbC;
}

うまくいかないと思います。

私の本当の質問は次のとおりです。指定された実際のコンクリート Bean を見つけるためのポータブルで標準的な方法はありますejbClassか?

4

1 に答える 1

1

注入ポイント「@EJB protected AbstractEjb ejb」は、期待どおりには機能しません。型消去が発生するため、注入された EJB が期待される型であると確信できないことに注意する必要があります。このような場合、ClassCastException がスローされます。コードをリファクタリングして、実際の EJB 実装でジェネリックを回避し、代わりに Local インターフェースでジェネリック抽象化を拡張することが必要な場合があります。EJB とジェネリクスのより完全な説明はhttp://blog.diabol.se/?p=353にあります。

于 2013-03-11T10:33:20.610 に答える