1

我正在使用 JAX-WS 开发一个项目。

我需要这样做。(我什至不确定这是否可能)

假设有三个这样的 EJB。

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;
}

我认为这行不通。

我真正的问题是;是否有任何便携式和标准的方法来定位指定的实际混凝土豆ejbClass

4

1 回答 1

1

注入点“@EJB protected AbstractEjb ejb”不会像您期望的那样工作。您必须记住会发生类型擦除,因此您不能确定注入的 EJB 是否属于预期类型。在这种情况下,将抛出 ClassCastException。您可能希望重构代码以避免实际 EJB 实现上的泛型,并使用 Local 接口来扩展泛型抽象。可以在http://blog.diabol.se/?p=353找到对 EJB 和泛型的更详尽解释。

于 2013-03-11T10:33:20.610 回答