将EJB 3.0注入到WebLogic 10.3.6上的Jersey 1.9中

3
我正在尝试将一个EJB 3.0 bean注入到运行在WebLogic 10.3.6上的Jersey 1.9 Servet中。
我已经尝试了这里列出的技术:Inject an EJB into JAX-RS (RESTful service) 这里的直接注入技术只会得到NullPointerException。使用@Provider技术会得到NameNotFoundException,因为它似乎会提取本地接口的完全限定名称。将代码更改为仅使用接口名称似乎也没有帮助。
我正在打包EAR文件。EJB在JAR文件中,而Jersey资源在WAR文件中。
在Java EE 5上的WebLogic 10.3.6中是否可能将EJB注入到Jersey中?
1个回答

3
显然,WebLogic 10.3.6不会将本地业务接口注入到JNDI注册表中。
根据Oracle支持文档1175123.1,必须在web.xml中添加ejb-local-ref:
  <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;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接