2013-04-20 17 views
7

Cosa causa questa eccezione, non riesco a scoprirlo.Che causa org.hibernate.PropertyAccessException: si è verificata un'eccezione all'interno del setter

Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Exception occurred inside setter of my.Class 

Causa principale:

javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Exception occurred inside setter of my.Class 

Codice:

@ManyToMany(fetch = FetchType.EAGER) 
public void setTags(Set<Tags> tags) { 
    this.tags.clear(); 

    for (Tag tag : tags) { 
     addTag(tag); 
    } 
} 


public boolean addTag(final Tag tag) { 
    if (tags.contains(tag)) { 
     return false; 
    } 

    return tags.add(tag); 
} 

ho inizializzare i tag nel costruttore:

tags = new HashSet<Tag>(); 

EDIT

eccezione accedendo metodo setter:

ax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Exception occurred inside setter of com.mycompany.domain.Book.Tags 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:838) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:781) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:201304051638] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:201304051638] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:201304051638] 
    at java.lang.reflect.Method.invoke(Method.java:601) ~[na:1.7.0] 
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) ~[spring-orm-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at $Proxy215.find(Unknown Source) ~[na:na] 
    at com.mycompany.persistence.BookJpaRepository.get(BookJpaRepository.java:22) ~[classes/:na] 
    at com.mycompany.service.BookService.getBook(BookService.java:44) ~[classes/:na] 
    at com.mycompany.service.BookService$$FastClassByCGLIB$$d6b91ae6.invoke(<generated>) ~[BookService$$FastClassByCGLIB$$d6b91ae6.class:na] 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698) ~[spring-aop-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) ~[spring-aop-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) ~[spring-tx-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631) ~[spring-aop-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at com.mycompany.service.BookService$$EnhancerByCGLIB$$e6a4e1a3.getBook(<generated>) ~[BookService$$EnhancerByCGLIB$$e6a4e1a3.class:na] 
    at com.mycompany.rest.controller.BookController.getFeedbackForBook(BookController.java:106) ~[classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:201304051638] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:201304051638] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:201304051638] 
    at java.lang.reflect.Method.invoke(Method.java:601) ~[na:1.7.0] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) ~[spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) ~[spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) ~[spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) ~[spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) ~[spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) ~[spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) ~[spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920) [spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:816) [spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) [javax.servlet-api.jar:3.0.1] 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801) [spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) [javax.servlet-api.jar:3.0.1] 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:175) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardHostValve.__invoke(StandardHostValve.java:161) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) [kernel.jar:3.1.2.1-SNAPSHOT] 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) [kernel.jar:3.1.2.1-SNAPSHOT] 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) [grizzly-http.jar:1.9.50] 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) [grizzly-http.jar:1.9.50] 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) [grizzly-http.jar:1.9.50] 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) [grizzly-http.jar:1.9.50] 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) [grizzly-framework.jar:1.9.50] 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) [grizzly-framework.jar:1.9.50] 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) [grizzly-framework.jar:1.9.50] 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) [grizzly-http.jar:1.9.50] 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) [grizzly-framework.jar:1.9.50] 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) [grizzly-framework.jar:1.9.50] 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) [grizzly-framework.jar:1.9.50] 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) [grizzly-utils.jar:1.9.50] 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) [grizzly-utils.jar:1.9.50] 
    at java.lang.Thread.run(Thread.java:722) [na:1.7.0] 
Caused by: org.hibernate.PropertyAccessException: Exception occurred inside setter of com.mycompany.domain.Book.Tags 
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:88) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:710) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:371) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:4499) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:185) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:137) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1103) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.Loader.processResultSet(Loader.java:960) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.Loader.doQuery(Loader.java:910) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:311) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.Loader.loadEntity(Loader.java:2111) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3917) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:460) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:429) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:206) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:262) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:150) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1091) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:174) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2473) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:987) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:807) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    ... 61 common frames omitted 
Caused by: java.lang.reflect.InvocationTargetException: null 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:201304051638] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:201304051638] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:201304051638] 
    at java.lang.reflect.Method.invoke(Method.java:601) ~[na:1.7.0] 
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:65) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    ... 85 common frames omitted 
Caused by: java.lang.NullPointerException: null 
    at org.hibernate.engine.internal.StatefulPersistenceContext.getLoadedCollectionOwnerOrNull(StatefulPersistenceContext.java:859) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.spi.AbstractCollectionEvent.getLoadedOwnerOrNull(AbstractCollectionEvent.java:75) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.spi.InitializeCollectionEvent.<init>(InitializeCollectionEvent.java:36) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1846) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:549) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:234) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:180) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at com.mycompany.domain.Book.setTags(Book.java:185) ~[classes/:na] 
    ... 90 common frames omitted 
+0

Come si inizializza la variabile 'tags' membro. È possibile che sia 'null' e che un NPE venga generato quando viene richiamato il setter? – stevevls

+0

Btw, annotare il setter non è supportato in Jpa/Hibernate, annotando invece getter o campo. –

risposta

15

La mia ipotesi è che Hibernate chiama il setter con la propria implementazione di Set (PersistentSet) che implementa il caricamento pigro e non è ancora inizializzato quando viene chiamato il setter. Dato che chiami un metodo su questo set, fa sì che il set si carichi automaticamente mentre è già in una fase di caricamento, il che mette Hibernate in uno stato incoerente.

Ecco perché preferisco utilizzare l'accesso al campo tramite l'accesso alla proprietà (ad esempio, inserire tutte le annotazioni di mappatura su campi anziché getter). Si vuole fare una copia del set passato quando il metodo viene chiamato dal codice "normale", ma non si vuole farlo quando Hibernate chiama il setter: si spezza completamente il caricamento pigro.

+6

In breve: cambia il tuo codice setter su 'this.tags = tags;', e dovrebbe funzionare bene. –

+0

Abbiamo fatto un progetto molto ampio con la strategia di accesso al campo, abbiamo affrontato molti problemi (ma è troppo tardi e ci costerà molto cambiare la strategia), perché non c'è modo di scavalcare i mapping in questa strategia, ma sovrascrivendo i metodi e re-annotando è possibile riconfigurare i mapping. –

+0

@JBNizet Funziona ora, tuttavia questo è un approccio negativo come dice Amir? – LuckyLuke

2

Da javadoc:

verificato un problema accesso a una proprietà di un'istanza di una classe persistente per riflessione, o tramite CGLIB. Ci sono una serie di possibili cause sottostanti, tra cui

- failure of a security check 
- an exception occurring inside the getter or setter method 
- a nullable database column was mapped to a primitive-type property 
- the Hibernate type was not castable to the property type (or vice-versa) 

direi, this.tags (campo) o tags (parametro) è null, ma per capirlo, è possibile stampare l'intero stack -trace, sarebbe puntare alla causa principale.

+0

No. È inizializzato nel costruttore. – LuckyLuke

+0

Prova a stampare tag al momento del settaggio ... perché se il tuo oggetto è costruito in base alla deserializzazione, il costruttore non viene eseguito. –

+0

Cosa intendi? – LuckyLuke

1

Il modo più semplice per capirlo è racchiudere le parti interne di setTags in un tentativo di cattura e registrare eventuali eccezioni utilizzando il sistema di registrazione desiderato.

La mia prima ipotesi è che la variabile di istanza dei tag sia nullo. Sarei molto sorpreso se questo non fosse il caso, ma dovrebbe essere banale verificare utilizzando un debugger in un test di integrazione

La mia seconda ipotesi sarebbe che l'argomento passato a setTags() non venga inizializzato correttamente, o è nullo o genera qualche tipo di eccezione quando il ciclo for tenta di eseguire iterazioni su di esso.

3

Si sta passando null come argomento del metodo, quindi per ogni costrutto genera un'eccezione.Utilizzare una condizione guardia e tutto va bene:

@ManyToMany(fetch = FetchType.EAGER) 
public void setTags(Set<Tags> tags) { 
    this.tags.clear(); 

    if (tags != null) { 
     for (Tag tag : tags) { 
      addTag(tag); 
     } 
    } 
} 

ma preferisco:

@ManyToMany(fetch = FetchType.EAGER) 
public void setTags(Set<Tags> tags) { 
    this.tags = tags; 
} 
+0

Non necessariamente "tu". Qui Hibernate stava chiamando il mio metodo setter passando un argomento 'nullo' e questo ha gettato l'eccezione. – Dinei

Problemi correlati