Java将EJB注入JAX-RS(RESTful服务)
我试图通过注释将无状态EJB注入到JAX-RS Web服务中。不幸的是,EJB是正义的null
,NullPointerException
当我尝试使用它时我得到了。
@Path("book")public class BookResource {
@EJB
private BookEJB bookEJB;
public BookResource() {
}
@GET
@Produces("application/xml")
@Path("/{bookId}")
public Book getBookById(@PathParam("bookId") Integer id)
{
return bookEJB.findById(id);
}
}
我究竟做错了什么?
以下是有关我的机器的一些信息:
- Glassfish 3.1
- Netbeans 6.9 RC 2
- Java EE" title="Java EE">Java EE 6
你们能举个可行的例子吗?
回答:
我不确定这是否行得通。所以:
选项1:使用注入提供程序SPI
实现一个提供程序,它将执行查找并注入EJB。看到:
@EJB注入。
com.sun.jersey:jersey-server:1.17的示例: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 javax.ejb.EJB;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.ws.rs.ext.Provider;
import java.lang.reflect.Type;
/**
* 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();
final Object o = ic.lookup(c.getName());
return new Injectable<Object>() {
public Object getValue() {
return o;
}
};
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
选项2:使BookResource成为EJB
@Stateless@Path("book")
public class BookResource {
@EJB
private BookEJB bookEJB;
//...
}
看到:
如何将REST服务与EJB 3.1结合
EJB 3.1和REST-轻量级混合
选项3:使用CDI
@Path("book")@RequestScoped
public class BookResource {
@Inject
private BookEJB bookEJB;
//...
}
以上是 Java将EJB注入JAX-RS(RESTful服务) 的全部内容, 来源链接: utcz.com/qa/420138.html