RequestFactory:代理实现与泛型的接口 [英] RequestFactory: Proxy implementing interface with generics

查看:139
本文介绍了RequestFactory:代理实现与泛型的接口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  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 。com.google.web上的.google.web.bindery.autobean.shared.impl.AutoBeanCodexImpl $ PropertyCoderCreator.maybeCreateCoder(AutoBeanCodexImpl.java:353)〜[gwt-servlet-2.6.0.jar:na]
。通过com.google.web.bindery.autobean.vm获取bindery.autobean.shared.impl.AutoBeanCodexImpl $ PropertyCoderCreator.visitReferenceProperty(AutoBeanCodexImpl.java:341)〜[gwt-servlet-2.6.0.jar:na]
.impl.ProxyAutoBean.traverseProperties(ProxyAutoBean.java:324)〜[gwt-servlet-2.6.0.jar:na]
at com.google.web.bindery.autobean.shared.impl.Abstr actAutoBean.traverse(AbstractAutoBean.java:166)〜[gwt-servlet-2.6.0.jar:na]
...

我的代理类:

  @ProxyFor(value = OutilLibre.class,locator = OutilLibreLocator .class)
public interface OutilLibreProxy extends ProxyWithId,ProxyWithCartoLibre< OutilProxy>,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);

$ b $ / code>

与泛型的接口:

  public interface ProxyWithCartoLibre< T> {

getCompetence();

void setCompetence(T competence);

String getCompetenceAutre();

void setCompetenceAutre(String competence);




$ b $ p
$ p

相应的服务器实体:

  @Entity 
@Table(name =outil_libre)
public class OutilLibre extends AEntityLongId implements IBeanCartoLibre< Outil> ;, 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长ID;
$ b $ @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]
,位于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 。我们b.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]
,位于com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.setProperty(ProxyAutoBean.java:253)〜[gwt-servlet.jar:na]
,位于com.google.web.bindery.autobean.vm.impl.BeanPropertyContext.set(BeanPropertyContext.java:44)〜[gwt-servlet.jar:na]
,位于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(AbstractAutoB ean.java:166)〜[gwt-servlet.jar:na]
at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.accept(AbstractAutoBean.java:101)〜[gwt-servlet .jar:na]
在com.google.web.bindery.requestfactory.server.Resolver.resolveClientValue(Resolver.java:470)〜[gwt-servlet.jar:na]
在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]
在javax.se rvlet.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]
在org.springframework上的org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:180)[spring-orm-3.2.4.RELEASE.jar:3.2.4.RELEASE]
。 web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)[spr ing-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]
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 ]
在org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)[spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE]
在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]
在org.springframework.security。 web.FilterChainProxy $ VirtualFilterChain.doFil ter(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]
在org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)[spring -security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE]
在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:342)[spring-security-web -3.1.4.RELEASE.jar:3.1.4.RELEASE]
在org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)[spring-security-web-3.1.4的.rel EASE.jar:3.1.4.RELEASE]
at org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:342)[spring-security-web-3.1.4.RELEASE.jar:在Spring中,你可以使用spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE]
在org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183)发布]
在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.sec urity.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)[spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE]
在org.springframework.security。 web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:342)[spring-security-web-3.1.4.RELEASE.jar:3.1.4.RELEASE]
在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]
在org.sp ringframework.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.Coyo teAdapter.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。 $ java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor。)
。 java:1145)[na:1.7.0_60]
在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. build a 基本的底层bean / POJO模型,用于您的类别avoidin g泛型(在最外面的类中,使用泛型似乎不成问题),也许使用 _ 等一些标记字符串来帮助避免(通过乐观的 interface 用法)稍后使用不需要的类/方法或提供所需的变体,例如:

      interface _Person< PERSON扩展了_Person< PERSON> >如果_Person不是
    //在AutoBean(de)序列化中引用它本身,则扩展IsSerializable {
    //泛型:仅用于显示泛型工作
    int getId();
    void setId(int id); //通常我们可能不想公开这个,但是对于
    //(de)序列化,它可能是必需的或有利的
    //现在在这里
    String getName();
    void setName(String name);
    // _ Person setName_(String name);
    //有流利的setter对Bean的定义并且
    //不能与AutoBeans一起使用,但由于没有getter
    //getName(),所以它被忽略并且可以工作:-)
    //(但最好不要包含在这里)
    _Address getAddr_();
    void setAddr_(_Address addr);
    }

    // interface _Address< ADDR扩展_Address>扩展了IsSerializable {
    // =>例如,导致NullPointerException! :-(
    // 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);
    }




    • 现在在 AutoBean 功能中使用这个功能将适用于这些功能,并且如果使用通用接口和实现这些后来应该工作(我只尝试过这样一个简单的例子来测试它)
      上面的例子应该工作(不完整的片段): AutoBeanCodex.encode(personAutoBean).deepCopy( )


  2. 现在创建通用接口和继承它们的类将具有缺点例如不可以




    • 返回一个通用的个人。 getAddr _()。getNonBeanFooExtension()

    • 利用流畅 person.setName_(foo).setMail(bar)

    • 等界面阻止/阻止访问 person.setId(123)



    因此我正在计划当它完成时)从这些被派生出来,但也是编写继承不相关/重叠的接口,它们/应该在整个业务应用程序中正常使用,例如:

      interface Person< PERSON扩展了Person< PERSON>> {
    // extends _Person< = no,因为那样我们就无法隐藏/阻止拨打
    //例如setId(....)
    int getId();

    String getName();
    // void setName(String name); //我们可以提供它,但setName_()做同样的
    //和更多,只有一个setter保持接口
    //更小
    PERSON setName_(String name);
    地址< PERSON> getAddr();
    PERSON setAddr(地址< PERSON> addr);

    PERSON setFancyThing(); //未被AutoBean看到,因此不应该
    //在那里引起麻烦
    }

    interface Address< PERSON扩展Person< PERSON> > {
    ...
    }


  3. 应该一般工作(现在只测试简单情况):

      class PersonDTO implements Person< PersonDTO> ;, _Person< PersonDTO> {
    ...
    }


  4. 这些实现的用户应该尽可能地使用来自2. Person&PersonDto>的接口。 pers = ... ,以便他们看到一些相当不错的人物界面,不能轻松调用 pers.setId( 123),但 pers.setName_(Dimitri Khalezov).setMail_(...)


这已经是一个很长的帖子,我希望你可以想象在不同地点缺少的细节。


I am struggling with requestfactories and generics. In the code below, the proxy methods are matching exactly with the entity methods, but I get the log trace:

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]
...

My proxy class:

@ProxyFor(value = OutilLibre.class, locator = OutilLibreLocator.class)
public interface OutilLibreProxy extends ProxyWithId, ProxyWithCartoLibre<OutilProxy>, 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);

}

The interface with generics:

public interface ProxyWithCartoLibre<T> {

    T getCompetence();

    void setCompetence(T competence);

    String getCompetenceAutre();

    void setCompetenceAutre(String competence);

}   

The corresponding server entity:

@Entity
@Table(name = "outil_libre")
public class OutilLibre extends AEntityLongId implements IBeanCartoLibre<Outil>, 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;
    }

}   

I don't know why I get this error because the ProxyWithCartoLibre interface is just used by client side classes and hasn't any purpose in defining the requestfactory.

Is there a way to tell the GWT generator to exclude the ProxyWithCartoLibre interface?

Thanks in advance.

EDIT

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]

解决方案

I also got this exception and tried a lot and came up with the following workaround:

  1. build a basic "underlying" bean/POJO model for your classes avoiding generics (in the outmost class, using generics does not seem to be a problem) and maybe using some "marker strings" like _ to help avoiding (via "optimistic" interface usage) later usage of "undesired classes/methods" or provide desired variants, e.g.:

    interface _Person< PERSON extends _Person<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 e.g. 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 );
    }
    

    • now using this with AutoBean functionality will work on those and if one uses generic interfaces and implementations around these later on should work (I tried only a simple example like this to test it for me). Example with above should work (incomplete snippet): AutoBeanCodex.encode( personAutoBean ).deepCopy()
  2. now creating generic interfaces and classes inheriting from those would have the disadvantage of e.g. not beeing able to

    • return a generic person.getAddr_().getNonBeanFooExtension() or
    • utilize a fluent interface like person.setName_( "foo" ).setMail( "bar" ) or
    • preventing/discourage access to person.setId( 123 )

    Therefore I am planning now (I'll report back when it's done) to derive from these beens nevertheless, but also writing "inheritance unrelated"/overlapping interfaces, that are/should be "normally" used throughout the business application, e.g.:

    interface Person< PERSON extends Person<PERSON>> {
       // extends _Person <= no, because then we could not "hide/discourage" users calling 
       // e.g. "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<PERSON> getAddr();
      PERSON setAddr( Address<PERSON> addr );
    
      PERSON setFancyThing();          // not "seen" by AutoBean and thus should not 
                                       // cause trouble there
    }
    
    interface Address< PERSON extends Person<PERSON> > {
      ...
    }
    

  3. now implementing classes like this should work in general (only tested simple case for now):

    class PersonDTO implements Person<PersonDTO>, _Person<PersonDTO> {
      ...
    }
    

  4. the "users" of those implementations should as much as possible work with the interfaces from 2. Person<PersonDto> pers = ... so they see some quite nice person interface and can't easily call pers.setId( 123 ), but pers.setName_( "Dimitri Khalezov" ).setMail_( ... )

It's already a long post and I hope you can imagine the missing details in various locations.

这篇关于RequestFactory:代理实现与泛型的接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆