我正在尝试在WAS 9.0.0.1上运行一个项目,该项目目前在WAS 8.5.5.x上运行正常。问题似乎是实体管理器没有被注入到DAO中,但这只发生在每个其他请求中。因此,当在DAO中执行em.createNamedQuery时,它会抛出NullPointerException,因为em是null,就像我上面解释的那样,奇怪的是它只是像其他所有请求一样失败。有什么想法吗?
的persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="OperationsAPI" transaction-type="JTA">
<jta-data-source>jdbc/operations</jta-data-source>
<class>com.i3.operations.entities.Operation</class>
<properties>
<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
</properties>
</persistence-unit>
</persistence>
资源类:
@Path("/operations")
@Api("Operations API")
@Stateless
public class OperationsService {
public static Logger logger = Logger.getLogger(OperationsService.class.getName());
@Context
UriInfo uriInfo;
@EJB
private static OperationDAO operationDAO;
public OperationsService() {
operationDAO = new OperationDAO();
}
@GET
@ApiOperation(value = "Gets all operations", response = Operation.class, responseContainer = "List")
@Produces(MediaType.APPLICATION_JSON)
public Response getOperationsAll() {
List<Operation> operations = operationDAO.getOperationsAll();
return Response.ok().entity(operations).build();
}
}
DAO:
@Stateless
public class OperationDAO {
public static Logger logger = Logger.getLogger(OperationDAO.class.getName());
@PersistenceContext(unitName="OperationsAPI")
private EntityManager em;
public List<Operation> getOperationsAll() {
logger.info("EntityManager: " + em);
TypedQuery<Operation> query = em.createNamedQuery("Operation.findAll", Operation.class);
return query.getResultList();
}
}
答案 0 :(得分:2)
您通常不想混合使用 new 运算符以及依赖注入(CDI等)来在给定类中设置相同的对象引用。
如果你的依赖图主要使用依赖注入,那么依赖注入(DI)应该实例化所有对象。否则,你最终会遇到创建DI不知道的对象实例的情况,因此它不知道将其依赖项注入其中。
这可能是您案件中发生的事情。由于这些EJB实例是合并的,因此您可能最终会将某些实例正确初始化,而某些实例则没有。
您可能想要更改为(或删除并默认):
public OperationsService() {}
我提到我不确定注入静态字段是一个好主意,但我还不足以建议删除<来自 operationDAO 的强>静态修饰符。