RequestFactory:代理实现与generics的接口

我正在努力处理requestfactories和generics。 在下面的代码中,代理方法与实体方法完全匹配,但我得到了日志跟踪:

java.lang.NullPointerException: null at com.google.web.bindery.autobean.vm.impl.MethodPropertyContext.traverse(MethodPropertyContext.java:102) ~[gwt-servlet-2.6.0.jar:na] at com.google.web.bindery.autobean.vm.impl.MethodPropertyContext.accept(MethodPropertyContext.java:75) ~[gwt-servlet-2.6.0.jar:na] at com.google.web.bindery.autobean.shared.impl.AutoBeanCodexImpl$PropertyCoderCreator.maybeCreateCoder(AutoBeanCodexImpl.java:353) ~[gwt-servlet-2.6.0.jar:na] at com.google.web.bindery.autobean.shared.impl.AutoBeanCodexImpl$PropertyCoderCreator.visitReferenceProperty(AutoBeanCodexImpl.java:341) ~[gwt-servlet-2.6.0.jar:na] at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.traverseProperties(ProxyAutoBean.java:324) ~[gwt-servlet-2.6.0.jar:na] at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.traverse(AbstractAutoBean.java:166) ~[gwt-servlet-2.6.0.jar:na] ... 

我的代理类:

 @ProxyFor(value = OutilLibre.class, locator = OutilLibreLocator.class) public interface OutilLibreProxy extends ProxyWithId, ProxyWithCartoLibre, EntityProxy { public Long getId(); public void setId(Long id); @Override OutilProxy getCompetence(); @Override void setCompetence(OutilProxy outil); @Override String getCompetenceAutre(); @Override void setCompetenceAutre(String competence); } 

与generics的接口:

 public interface ProxyWithCartoLibre { T getCompetence(); void setCompetence(T competence); String getCompetenceAutre(); void setCompetenceAutre(String competence); } 

相应的服务器实体:

 @Entity @Table(name = "outil_libre") public class OutilLibre extends AEntityLongId implements IBeanCartoLibre, IUniqueVersionEntity { private static final long serialVersionUID = 45107725880220830L; @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "outil_libre_seq_gen") @SequenceGenerator(name = "outil_libre_seq_gen", sequenceName = "seq_outil_libre") @Column(name = "id", unique = true, nullable = false, precision = 5, scale = 0) private Long id; @Cascade(value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE}) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "outil", nullable = false) private Outil outil; @Column(name = "outil_autre") private String outilAutre; @Override public Long getId() { return id; } @Override public void setId(Long id) { this.id = id; } @Override public Outil getCompetence() { return outil; } @Override public void setCompetence(Outil outil) { this.outil = outil; } @Override public String getCompetenceAutre() { return outilAutre; } @Override public void setCompetenceAutre(String competence) { this.outilAutre = competence; } } 

我不知道为什么我会收到此错误,因为ProxyWithCartoLibre接口仅由客户端类使用,并且没有任何用于定义requestfactory的目的。

有没有办法告诉GWT生成器排除ProxyWithCartoLibre接口?

提前致谢。

编辑

 java.lang.NullPointerException: null at com.google.web.bindery.autobean.vm.impl.MethodPropertyContext.traverse(MethodPropertyContext.java:102) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.vm.impl.MethodPropertyContext.accept(MethodPropertyContext.java:75) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.shared.impl.AutoBeanCodexImpl$PropertyCoderCreator.maybeCreateCoder(AutoBeanCodexImpl.java:353) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.shared.impl.AutoBeanCodexImpl$PropertyCoderCreator.visitReferenceProperty(AutoBeanCodexImpl.java:341) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.traverseProperties(ProxyAutoBean.java:324) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.traverse(AbstractAutoBean.java:166) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.accept(AbstractAutoBean.java:101) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.shared.impl.AutoBeanCodexImpl.doCoderFor(AutoBeanCodexImpl.java:522) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.setProperty(AbstractAutoBean.java:276) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.setProperty(ProxyAutoBean.java:253) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.vm.impl.BeanPropertyContext.set(BeanPropertyContext.java:44) ~[gwt-servlet.jar:na] at com.google.web.bindery.requestfactory.server.Resolver$PropertyResolver.visitValueProperty(Resolver.java:211) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.traverseProperties(ProxyAutoBean.java:289) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.traverse(AbstractAutoBean.java:166) ~[gwt-servlet.jar:na] at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.accept(AbstractAutoBean.java:101) ~[gwt-servlet.jar:na] at com.google.web.bindery.requestfactory.server.Resolver.resolveClientValue(Resolver.java:470) ~[gwt-servlet.jar:na] at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.processInvocationMessages(SimpleRequestProcessor.java:491) ~[gwt-servlet.jar:na] at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:233) ~[gwt-servlet.jar:na] at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:135) ~[gwt-servlet.jar:na] at com.google.web.bindery.requestfactory.server.RequestFactoryServlet.doPost(RequestFactoryServlet.java:133) ~[gwt-servlet.jar:na] at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) [servlet-api.jar:na] at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) [servlet-api.jar:na] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) [catalina.jar:7.0.39.B] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.39.B] at ch.qos.logback.access.servlet.TeeFilter.doFilter(TeeFilter.java:55) [logback-access-1.0.13.jar:na] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [catalina.jar:7.0.39.B] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.39.B] at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:180) [spring-orm-3.2.4.RELEASE.jar:3.2.4.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-3.2.2.RELEASE.jar:3.2.2.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [catalina.jar:7.0.39.B] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.39.B] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:146) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) [spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE] at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) [spring-web-3.2.2.RELEASE.jar:3.2.2.RELEASE] at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) [spring-web-3.2.2.RELEASE.jar:3.2.2.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [catalina.jar:7.0.39.B] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.39.B] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) [spring-web-3.2.2.RELEASE.jar:3.2.2.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-3.2.2.RELEASE.jar:3.2.2.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [catalina.jar:7.0.39.B] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.39.B] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) [catalina.jar:7.0.39.B] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) [catalina.jar:7.0.39.B] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [catalina.jar:7.0.39.B] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) [catalina.jar:7.0.39.B] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) [catalina.jar:7.0.39.B] at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947) [catalina.jar:7.0.39.B] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) [catalina.jar:7.0.39.B] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) [catalina.jar:7.0.39.B] at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009) [tomcat-coyote.jar:7.0.39.B] at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) [tomcat-coyote.jar:7.0.39.B] at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) [tomcat-coyote.jar:7.0.39.B] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_60] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_60] at java.lang.Thread.run(Thread.java:745) [na:1.7.0_60] 

我也得到了这个例外并尝试了很多并提出了以下解决方法:

  1. 为你的类构建一个基本的“底层”bean / POJO模型,避免使用generics (在最外层,使用generics似乎不是一个问题)并且可能使用像_这样的“标记字符串”来帮助避免(通过“乐观” 界面)用法)以后使用“不受欢迎的类/方法”或提供所需的变体 ,例如:

     interface _Person< PERSON extends _Person > extends IsSerializable { // generics here: just to show that generics work if _Person is not // referenced itself in AutoBean (de)serialization int getId(); void setId( int id ); // normally we may not want to expose this, but for the // (de)serialization it is/may be necessary or benefitial // here now String getName(); void setName( String name ); //_Person setName_( String name ); // to have fluent setters is against Bean definition and does // not work with AutoBeans, but since there is no getter // "getName()" it is ignored and would work :-) // (but it may be better to not include it in here) _Address getAddr_(); void setAddr_( _Address addr ); } //interface _Address< ADDR extends _Address > extends IsSerializable { // => would eg cause the NullPointerException ! :-( // at com.google.web.bindery.autobean.vm.impl.MethodPropertyContext.traverse( // MethodPropertyContext.java:102) ~[gwt-user-2.6.0.jar:na] interface _Address extends IsSerializable { String getCity_(); void setCity_( String city ); } 
    • 现在使用它与AutoBeanfunction将适用于那些,如果一个使用通用接口和后面的实现应该工作(我只尝试这样一个简单的例子来测试它)。 上面的示例应该工作(不完整的代码段): AutoBeanCodex.encode( personAutoBean ).deepCopy()
  2. 现在创建通用接口和从那些inheritance的类将具有例如不能够缺点

    • 返回一个通用的person.getAddr_().getNonBeanFooExtension()
    • 利用流畅的界面,如person.setName_( "foo" ).setMail( "bar" )
    • 阻止/阻止访问person.setId( 123 )

    因此,我现在正在计划(我将在完成时报告)从这些来源中得出,但是还要编写“inheritance无关”/重叠接口,这些接口应该在整个业务应用程序中“正常”使用 ,例如:

     interface Person< PERSON extends Person> { // extends _Person <= no, because then we could not "hide/discourage" users calling // eg "setId(....)" int getId(); String getName(); //void setName( String name ); // we could provide it, but setName_() does the same // and more and only one setter keeps the interface // smaller PERSON setName_( String name ); Address getAddr(); PERSON setAddr( Address addr ); PERSON setFancyThing(); // not "seen" by AutoBean and thus should not // cause trouble there } interface Address< PERSON extends Person > { ... } 
  3. 现在实现这样的类应该是一般的(现在只测试简单的情况):

     class PersonDTO implements Person, _Person { ... } 
  4. 这些实现“用户”应该尽可能地使用来自2的接口Person pers = ...所以他们看到一些相当不错的人界面并且不能轻易调用pers.setId( 123 ) ,但是pers.setName_( "Dimitri Khalezov" ).setMail_( ... )

这已经很长了,我希望你能想象各个地方缺少的细节。