2017-12-07 30 views
1

WAS 8.5.1.x에서 현재 작동하는 WAS 9.0.0.1에서 프로젝트를 실행하려고합니다. 문제는 entitymanager가 DAO에 주입되지 않는 것 같지만, 다른 모든 요청에서만 발생합니다. 그래서 em.createNamedQuery를 DAO에서 수행 할 때, em이 null이기 때문에 NullPointerException을 던지고 있습니다. 이상한 일을 설명했듯이, 다른 모든 요청과 같이 실패하는 것입니다. 어떤 아이디어?Websphere Application Server 9.0.0.1 - EntityManager는 다른 모든 요청마다 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

확실하지 않습니다. 그러나, 나는 이것을 직접 newing에서 'operationDAO = new OperationDAO();'라고 생각할 것입니다. 컨테이너의 ** EntityManager ** 주입을 트리거하지 않습니다. 컨테이너에 ** OperationDAO **를 대신 주입해야합니까? 대신 인수가없는 생성자에서 정적 필드를 덮어 쓰지 않으시겠습니까? –

+0

아, 네가 맞다면 거기 있으면 안된다. – Carlos

답변

2

당신은 일반적으로 새로운 운영자 모두의 사용을 혼합하고 싶지 않아 또한 같은 객체를 설정하는 의존성 주입 (CDI 등) 주어진 클래스의 rences.

의존성 그래프가 주로 종속성 주입을 사용하는 경우 종속성 주입 (DI)은 모든 객체를 인스턴스화해야합니다. 그렇지 않으면 DI가 알지 못하는 객체 인스턴스를 생성하는 경우가 발생하므로 종속성을 주입 할 수 없습니다.

이것은 아마도 귀하의 경우에 일어난 일입니다. 이러한 EJB 인스턴스가 풀링되므로 일부 인스턴스가 올바르게 초기화되고 일부 인스턴스가 올바르게 초기화되지 않을 수 있습니다.

public OperationsService() {} 

내가이 정적 필드에 주입 확실하지 않다 말할 것 좋은 생각,하지만 난 :

당신은 아마로 변경 (또는 제거 및 기본) 할 정적 수정자를 operationDAO에서 제거하라는 전문가는 충분하지 않습니다.