Websphere Application Server 9.0.0.1 - EntityManager 每隔一个请求为空
Websphere Application Server 9.0.0.1 - EntityManager is null every other request
我正在尝试 运行 WAS 9.0.0.1 上的一个项目,该项目目前在 WAS 8.5 上运行良好。5.x。问题似乎是 entitymanager 没有被注入到 DAO 中,但这只会在其他请求中发生。因此,当在 DAO 中执行 em.createNamedQuery 时,它会抛出一个 NullPointerException,因为 em 为空,就像我在上面解释的那样,奇怪的是它只是每隔一个请求就这样失败。有什么想法吗?
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>
资源class:
@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();
}
}
道:
@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();
}
}
您通常不希望混合使用 new 运算符和依赖注入(CDI 等)来在给定的 class。
如果您的依赖关系图主要使用依赖注入,那么依赖注入 (DI) 应该实例化所有对象。否则,您最终会创建一个 DI 不知道的对象实例,因此它不知道将其依赖项注入其中。
这可能就是您遇到的情况。由于这些 EJB 实例是池化的,您最终可能会得到一些实例已正确初始化,而另一些实例未正确初始化的情况。
您可能想更改为(或删除和默认):
public OperationsService() {}
我会提到我不确定注入 static 字段是个好主意,但我还不够专家建议删除 static 来自 operationDAO.
的修饰符
我正在尝试 运行 WAS 9.0.0.1 上的一个项目,该项目目前在 WAS 8.5 上运行良好。5.x。问题似乎是 entitymanager 没有被注入到 DAO 中,但这只会在其他请求中发生。因此,当在 DAO 中执行 em.createNamedQuery 时,它会抛出一个 NullPointerException,因为 em 为空,就像我在上面解释的那样,奇怪的是它只是每隔一个请求就这样失败。有什么想法吗?
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>
资源class:
@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();
}
}
道:
@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();
}
}
您通常不希望混合使用 new 运算符和依赖注入(CDI 等)来在给定的 class。
如果您的依赖关系图主要使用依赖注入,那么依赖注入 (DI) 应该实例化所有对象。否则,您最终会创建一个 DI 不知道的对象实例,因此它不知道将其依赖项注入其中。
这可能就是您遇到的情况。由于这些 EJB 实例是池化的,您最终可能会得到一些实例已正确初始化,而另一些实例未正确初始化的情况。
您可能想更改为(或删除和默认):
public OperationsService() {}
我会提到我不确定注入 static 字段是个好主意,但我还不够专家建议删除 static 来自 operationDAO.
的修饰符