Внедрить EJB 3.0 в Джерси 1.9 на WebLogic 10.3.6

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

Я попробовал методы, перечисленные здесь: Внедрить EJB в JAX-RS (RESTful сервис)

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

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

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

1 ответ

Решение

Очевидно, что WebLogic 10.3.6 не внедряет локальные бизнес-интерфейсы в реестр JNDI.

Согласно примечанию поддержки Oracle 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;
        }
    }
}
Другие вопросы по тегам