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.

的修饰符