jersey - 使用ejb注射测试休息端点服务

时间:2015-09-15 08:22:01

标签: jersey grizzly

我有一个jax-rs资源

@Path("rest/v1/serviceemail")
public class PreviewResource implements Preview
{  
  @EJB
  private Mapper mapper;

我正在使用jersey-test-framework-core和jersey-test-framework-grizzly2创建一个IT测试。

当我启动测试时,ejb没有注入服务中,因此我收到了NPE。

1 个答案:

答案 0 :(得分:1)

我通过实现自定义 InjectableProvider 找到了解决方案。以下代码取自Oracle article

import javax.ejb.EJB;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.ws.rs.ext.Provider;

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;

@Provider
public class EJBProvider implements InjectableProvider<EJB, Type> {

    public Scope getScope() {
        return Scope.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();

            final Object o = ic.lookup(c.getName());

            return new Injectable<Object>() {
                public Object getValue(HttpContext c) {
                    return o;
                }                    
            };            
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

我不得不稍微调整它以适应我的环境。另请注意,提供商必须与您的服务类位于同一个包中,否则它将无法被接收(它没有在文章中说明。)