Websphere Application Server 9.0.0.1 - 每个其他请求的EntityManager都为null

时间:2017-12-07 14:29:06

标签: jax-rs websphere jpa-2.0

我正在尝试在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();

    }
}

1 个答案:

答案 0 :(得分:2)

您通常不想混合使用 new 运算符以及依赖注入(CDI等)来在给定类中设置相同的对象引用。

如果你的依赖图主要使用依赖注入,那么依赖注入(DI)应该实例化所有对象。否则,你最终会遇到创建DI不知道的对象实例的情况,因此它不知道将其依赖项注入其中。

这可能是您案件中发生的事情。由于这些EJB实例是合并的,因此您可能最终会将某些实例正确初始化,而某些实例则没有。

您可能想要更改为(或删除并默认):

 public OperationsService() {}

我提到我不确定注入静态字段是一个好主意,但我还不足以建议删除<来自 operationDAO 的强>静态修饰符。