Очевидно, что WebLogic 10.3.6 не вводит локальные бизнес-интерфейсы в реестр JNDI.
Согласно Oracle Support запиской 1175123.1, один необходимо добавить ejb-local-ref
к web.xml
:
<ejb-local-ref>
<ejb-ref-name>[Name of EJB local interface here]</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>[Fully qualified path to EJB local interface]</local>
</ejb-local-ref>
Очень важно, что ejb-ref-name
совпадает с именем интерфейса, потому что это то, что получается в коде ниже, чтобы инъекции.
Код, приведенный ниже, изменен из указанной выше ссылки, чтобы получить простую форму для Interface
с префиксом java:comp/env/
, чтобы соответствовать стандарту именования WebLogic 10.3.6.
import com.sun.jersey.core.spi.component.ComponentContext;
import com.sun.jersey.core.spi.component.ComponentScope;
import com.sun.jersey.spi.inject.Injectable;
import com.sun.jersey.spi.inject.InjectableProvider;
import java.lang.reflect.Type;
import javax.ejb.EJB;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.ws.rs.ext.Provider;
/**
* JAX-RS EJB Injection provider.
*/
@Provider
public class EJBProvider implements InjectableProvider<EJB, Type> {
public ComponentScope getScope() {
return ComponentScope.Singleton;
}
public Injectable getInjectable(ComponentContext cc, EJB ejb, Type t) {
if (!(t instanceof Class))
return null;
try {
Class c = (Class)t;
Context ic = new InitialContext();
String simpleName = String.format("java:comp/env/%s", c.getSimpleName());
final Object o = ic.lookup(simpleName);
return new Injectable<Object>() {
public Object getValue() {
return o;
}
};
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}