2017-12-07 5 views
1

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(); 

    } 
} 
+1

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? –

+0

Ahh, du hast recht, das sollte nicht da sein. – Carlos

Antwort

2

Sie normalerweise nicht wollen, verwenden sowohl der neuen Betreiber mischen und auch Abhängigkeitsinjektion (CDI, etc.), um die gleiche Objektreferenz zu setzen in einer bestimmten Klasse.

Wenn Ihr Abhängigkeitsdiagramm hauptsächlich die Abhängigkeitsinjektion verwendet, sollte die Injection Injection (DI) alle Objekte instanziieren. Andernfalls haben Sie den Fall, dass Sie eine Objektinstanz erstellen, von der DI nichts weiß, sodass sie ihre Abhängigkeiten nicht eingibt.

Dies ist wahrscheinlich, was in Ihrem Fall passiert. Da diese EJB-Instanzen zusammengefasst sind, können einige Ihrer Instanzen korrekt initialisiert worden sein, andere nicht.

Sie wollen wahrscheinlich nur (oder entfernen und Standard) ändern:

public OperationsService() {} 

Ich erwähne ich bin nicht sicher, Injektion in einen statischen Bereich ist eine gute Idee, aber ich bin nicht wirklich genug von einem Experten zu empfehlen, die statische Modifizierer aus OperationDAO entfernen.

Verwandte Themen