2014-10-20 97 views
1

我需要用我自己的ExclusionStrategy在GSON,所以我創造了這個類:getDeclaringClass原因無法懶洋洋地初始化例外

public class DUExclusionStrategy implements ExclusionStrategy { 
    public boolean shouldSkipField(FieldAttributes f) { 
     Collection<Annotation> annots = f.getAnnotations(); 
     for(Annotation a : annots) { 
      if(a.annotationType().equals(Expose.class)) { 
       return false; 
      } 
     } 

     return (f.getDeclaringClass() == BaseEntityImpl.class && f.getName().equals("creation")) 
       || (f.getDeclaringClass() == BaseEntityImpl.class && f.getName().equals("creator")) 
       || (f.getDeclaringClass() == BaseEntityImpl.class && f.getName().equals("modification")) 
       || (f.getDeclaringClass() == BaseEntityImpl.class && f.getName().equals("modificator")); 
    } 

    public boolean shouldSkipClass(Class<?> clazz) { 
     return false; 
    } 
} 

我不應該改變BaseEntityImpl任何東西,並且在這個類這一領域:

@OneToMany(mappedBy="parent", fetch=FetchType.LAZY) @OrderBy("ordinal") 
private Set<T> children = new TreeSet<T>(); 

,並呼籲f.getDeclaringClass()的,因爲應用程序拋出此異常:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: cz.bach.dataframe2.domain.impl.BaseEntityImpl.children, could not initialize proxy - no Session 
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124) 
    at org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:180) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:95) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
    at com.google.gson.Gson.toJson(Gson.java:593) 
    at com.google.gson.Gson.toJson(Gson.java:572) 
    at com.google.gson.Gson.toJson(Gson.java:527) 
    at com.google.gson.Gson.toJson(Gson.java:507) 
    at cz.bach.clients.du.model.service.DUSerializer.serialize(DUSerializer.java:23) 
    at cz.bach.clients.du.model.service.DURepository.save(DURepository.java:619) 
    at cz.bach.clients.du.model.service.DURepository.appendChild(DURepository.java:176) 
    at cz.bach.clients.du.model.service.DURepository.appendChild(DURepository.java:150) 
    at cz.bach.clients.du.model.service.DURepository$$FastClassByCGLIB$$f2fe0d5d.invoke(<generated>) 
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) 
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622) 
    at cz.bach.clients.du.model.service.DURepository$$EnhancerByCGLIB$$a27cbe9c.appendChild(<generated>) 
    at cz.bach.clients.du.ui.perspectives.main.DUDispatcher.add(DUDispatcher.java:261) 
    at cz.bach.archives.uiframe.actions.CommonAddAction.run(CommonAddAction.java:11) 
    at cz.bach.clients.du.ui.perspectives.main.DUToolbar$1.buttonClick(DUToolbar.java:71) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510) 
    at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:164) 
    at com.vaadin.ui.AbstractComponent.fireEvent(AbstractComponent.java:1219) 
    at com.vaadin.ui.Button.fireClick(Button.java:567) 
    at com.vaadin.ui.Button.changeVariables(Button.java:223) 
    at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.changeVariables(AbstractCommunicationManager.java:1460) 
    at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariableBurst(AbstractCommunicationManager.java:1404) 
    at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariables(AbstractCommunicationManager.java:1329) 
    at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.doHandleUidlRequest(AbstractCommunicationManager.java:761) 
    at com.vaadin.terminal.gwt.server.CommunicationManager.handleUidlRequest(CommunicationManager.java:325) 
    at com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:501) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:83) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Unknown Source) 

我可以通過簡單而優雅的方式解決這個問題嗎?我真的沒有看到任何理由爲什麼getDeclaringClass()應該引起BaseEntityImpl的完整工廠化..

在此先感謝!

+0

確定'getDeclaringClass()'的問題是,它的工作原理沒有它?這在堆棧跟蹤中沒有提及。你在'DUSerializer#serialize()'中做了什麼,它在事務內部嗎? – 2014-10-20 09:17:58

+0

是的,我確定。沒有這個調用(或調用f.getName()),一切正常。我試圖把方法交易,但沒有解決什麼.. – Firzen 2014-10-20 10:20:39

回答

2

BaseEntityImpl實體變化fetchType懶的渴望,即

@OneToMany(mappedBy="parent", fetch=FetchType.EAGER) 
+0

我寫道:「我不應該改變任何在BaseEntityImpl」。這不是解決方案,但謝謝。 :-) – Firzen 2014-10-20 09:10:30

+0

這是您需要以另一種方式熱切地獲取方法的方法使用方法服務中的Transactional和初始化對象 – 2014-10-20 09:18:07

相關問題