2013-12-11 3 views
3

Я пытаюсь вставить и компонент EJB 3.0 в сервисный сервер Jersey 1.9, работающий на WebLogic 10.3.6.Inject EJB 3.0 в Jersey 1.9 на WebLogic 10.3.6

Я попытался методы, перечисленные здесь: Inject an EJB into JAX-RS (RESTful service)

Методы прямого впрыска здесь просто дать NullPointerException. Метод @Provider дает NameNotFoundException, потому что он, похоже, вытаскивает полное имя локального интерфейса. Изменение кода для использования только имени интерфейса, похоже, не помогает.

Я упаковываю в EAR. EJB находится в JAR, а ресурсы Jersey находятся в WAR.

Возможно ли внедрение EJB в Джерси на Java EE 5 на WebLogic 10.3.6?

ответ

3

Очевидно, что 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; 
     } 
    } 
} 
Смежные вопросы