2013-10-19 3 views
0

Maven에서 datanucleus 3.2.7을 사용 중이며 Amazon S3 JPA 공급자를 사용하려고합니다. S3에 데이터를 성공적으로 쓸 수 있지만 "SELECT u FROM User u"또는 "SELECT u FROM User WHERE id = : id"를 사용하여 쿼리하면 query.getResultList()를 호출 할 때 NullPointerException이 throw됩니다.S3가있는 datanucleus-json을 사용하는 NullPointerException

RDBMS 제공자를 사용하면 모든 것이 완벽하게 작동합니다. 내가 뭘 잘못하고 있니?

Main.java

EntityManagerFactory factory = Persistence.createEntityManagerFactory("MyUnit"); 
    EntityManager entityManager = factory.createEntityManager(); 
    Query query = entityManager.createQuery("SELECT u FROM User u", User.class); 
    List<User> users = query.getResultList(); // Null pointer exception here (This is line 16!) 
    for(User u:users) 
     System.out.println(u); 

User.java

package test; 
import javax.persistence.*; 

@Entity 
@Table(name = "User") 
public class User { 
    @Id 
    public String id; 
    public String name; 

    public User(String id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    public String toString() { 
     return id+" : "+name; 
    } 
} 

의 persistence.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<persistence 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_1_0.xsd" 
    version="1.0"> 

    <persistence-unit name="MyUnit"> 
     <class>test.User</class> 
     <exclude-unlisted-classes /> 

     <properties> 
      <properties> 
       <property name="datanucleus.ConnectionURL" value="amazons3:http://s3.amazonaws.com/" /> 
       <property name="datanucleus.ConnectionUserName" value="xxxxx" /> 
       <property name="datanucleus.ConnectionPassword" value="xxxxx" /> 
       <property name="datanucleus.cloud.storage.bucket" value="my-bucket" /> 
      </properties> 
      <property name="datanucleus.autoCreateSchema" value="true" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

예외

java.lang.NullPointerException 
     at org.datanucleus.NucleusContext.isClassWithIdentityCacheable(NucleusContext.java:1840) 
     at org.datanucleus.ExecutionContextImpl.getObjectFromLevel2Cache(ExecutionContextImpl.java:5287) 
     at org.datanucleus.ExecutionContextImpl.getObjectFromCache(ExecutionContextImpl.java:5191) 
     at org.datanucleus.ExecutionContextImpl.findObject(ExecutionContextImpl.java:3137) 
     at org.datanucleus.store.json.CloudStoragePersistenceHandler.getObjectsOfCandidateType(CloudStoragePersistenceHandler.java:367) 
     at org.datanucleus.store.json.query.JPQLQuery.performExecute(JPQLQuery.java:94) 
     at org.datanucleus.store.query.Query.executeQuery(Query.java:1786) 
     at org.datanucleus.store.query.Query.executeWithMap(Query.java:1690) 
     at org.datanucleus.api.jpa.JPAQuery.getResultList(JPAQuery.java:194) 
     at test.Main.main(Main.java:16) 

이 오류는 datanucleus가 항목에 대해 JSON을 deserialize 할 때 발생하는 것으로 보입니다. 버킷에서 모든 것을 삭제하면 아무런 문제없이 빈 세트가 반환됩니다. L2 캐싱을 끄면 예외가 발생했습니다. ExecutionContextImpl.findObject에 null ID가 지정되어있는 것으로 보입니다.

+0

을 확인하기위한 그건? –

+0

'Main.main() Line - 16'? – Sage

+0

목록 사용자 = query.getResultList(); // 널 포인터 예외는 여기에있다 (이것은 16 행이다!) – mseddon

답변

0

datanucleus-JSON 버전 3.2.1 가능성이 수정,하지만 Main.main에 라인 16 일이 무슨 당신이

+0

이것은 질문에 대한 대답을 제공하지 않는다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남겨 둡니다. – Bucket

+1

물론 대답을 제공합니다. 이는 사용자가 사용하고있는 것보다 더 최신 버전이며, 문제를 해결할 가능성이 큽니다. – DataNucleus

관련 문제