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