2014-06-14 5 views
0

같은 주제에 대해 수백 가지 답변을 읽었지만 여전히 작동하지 않습니다! 나는 이런 식으로 내 EntityManager를 호출EntityManager를 초기화 할 때 NPE

@Stateless 
public class MyTest { 

@PersistenceContext 
private EntityManager entityManager; 

public Long create(MyUser user) { 
    entityManager.persist(user); 
    return user.getId(); 
} 
} 

은 그 때 나는 이런 식으로, REST 웹 서비스를 이용하여이 클래스를 호출

@Path("/myapp/{username}") 
@ApplicationScoped 
public class MyResource implements Serializable { 

private static final long serialVersionUID = 1L; 

MyTest service = new MyTest(); 

@POST 
@Consumes({"application/json"}) 
@Produces({"text/plain"}) 
public String create(@Valid MyUser user) { 

    MyUser testUser = new MyUser(); 
    //testUser.setParams(some_parameters) 

    return service.create(testUser).toString(); 

    return ""; 
} 

} 

나는 항상 NullPointerException이 얻을 POST 요청을 할 때, EntityManager는 항상 null이기 때문에.

내 persistence.xml 아래이지만 내 응용 프로그램이 잘 배치되어 데이터베이스에 테이블을 완벽하게 생성하기 때문에 문제가없는 것 같습니다.

<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="myserver-unit" transaction-type="JTA"> 
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
<jta-data-source>jdbc/MyData</jta-data-source> 
<properties> 
    <property name="javax.persistence.schema-generation.create-source" value="metadata-then-script"/> 
    <property name="javax.persistence.schema-generation.drop-source" value="metadata-then-script"/> 
    <property name="javax.persistence.schema-generation.create-script-source" value="create-script.sql"/> 
    <property name="javax.persistence.schema-generation.drop-script-source" value="drop-script.sql"/> 
    <property name="javax.persistence.sql-load-script-source" value="load-script.sql"/> 
    <property name="eclipselink.logging.level" value="FINEST"/> 
    <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/> 
    <property name="eclipselink.jdbc.user" value="APP"/> 
    <property name="eclipselink.jdbc.password" value="APP"/> 
</properties> 

당신은 나에게 힌트를 줄 수주십시오? EntityManager를 초기화하는 또 다른 방법이 있습니까? Netbeans 8 및 GlassFish 4와 함께 작업하고 있습니다.

나는 주사 대신에 "표준 방법"으로 MyTest의 메소드를 호출하는 대신 이미 주입 문제가있었습니다.

+0

사이에 상황에 맞는 불일치가 다른 @Singleton하는 @Stateless에서 MYTEST 변경 ' 이 방법으로 MyTest 서비스를 만들 수 있습니다. '@ EJB'를 사용해야하는데, 그 문제는 무엇입니까? – unwichtich

답변

1

그런 방식으로 컨테이너 관리 객체 (예 : EJB)를 인스턴스화 할 수 없습니다. @EJB로 주석을 달아 EJB를 주입해야한다. 수동 JNDI 조회를 사용하지 않으려면 이것이 유일한 방법이지만이를 수행 할 필요는 없습니다.

또한 당신은 아마 @RequestScoped는 JAX-RS 엔드 포인트 및 모든 것에 @ApplicationScoped 변경해야합니다 -하거나 외설 당신이 @ApplicationScoped와 @Stateless

+0

감사합니다. 이제 EJB 주석과 완벽하게 작동합니다. 초보자로서, 나는 이미 그들에게 문제가 있었기 때문에 주입 기능을 사용하기를 꺼 렸습니다. (나의 이전 질문을보십시오.) 제 첫인상은 그들이 단순화하는 것보다 더 많은 삶을 복잡하게한다는 것입니다. 그러나이 경우에는 괜찮습니다. – splinter123

관련 문제