按类定位LocalBean

时间:2013-01-09 05:32:29

标签: ejb ejb-3.1 openejb

我正在使用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的实际具体bean?

1 个答案:

答案 0 :(得分:1)

注入点“@EJB protected AbstractEjb ejb”将无法按预期方式工作。您必须记住发生类型擦除,因此您无法确定注入的EJB是否为预期类型。在这种情况下,将抛出ClassCastException。您可能希望重构代码以避免实际EJB实现上的泛型,并且让Local接口扩展通用抽象。可以在http://blog.diabol.se/?p=353找到有关EJB和泛型的更全面的解释。