Ich versuche, ein Projekt auf WAS 9.0.0.1 auszuführen, das derzeit auf WAS 8.5.5.x funktioniert. Das Problem scheint zu sein, dass der Entitymanager nicht in das DAO injiziert wird, aber das passiert nur bei jeder anderen Anfrage. Wenn also em.createNamedQuery im DAO ausgeführt wird, wirft es eine NullPointerException, weil das em null ist, wie ich oben erklärt habe, ist das seltsame Ding, dass es nur so wie jede andere Anfrage fehlschlägt. Irgendwelche Ideen?Websphere Application Server 9.0.0.1 - EntityManager ist null jede andere Anfrage
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>
Ressourcenklasse:
@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();
}
}
Nicht sicher genau. Aber ich vermute, wenn ich dies direkt neu 'operationsDAO = new OperationDAO(); 'initiiere, löst der Container den ** EntityManager ** nicht aus. Soll der Container stattdessen die Operation ** OperationDAO ** ständig injizieren, anstatt ein statisches Feld im No-Arg-Konstruktor zu überschreiben? –
Ahh, du hast recht, das sollte nicht da sein. – Carlos