/ / GWT RequestFactory, ako prepísať getry v EntityProxy? - java, gwt, requestfactory

GWT RequestFactory, ako prepísať gettery v EntityProxy? - java, gwt, requestfactory

Používam zariadenie GWT RequestFactory a chcemzdieľať nejaký kód medzi klientom a serverom. Na dosiahnutie svojho cieľa som implementoval spoločné rozhranie medzi proxy klienta a triedami domén servera. Takže mám niečo ako:

  • spoločné rozhrania

    public interface IPerson {
    IColor getColor();
    }
    
    public interface IColor {
    String getColor();
    }
    
  • triedy domén

        public class Person implements IPerson {
    private Color color;
    public Color getColor() {
    return color;
    }
    }
    
    public class Color implements IColor {
    private String color;
    public String getColor() {
    return color;
    }
    }
    
  • proxy rozhrania

        @ProxyFor(Person.class)
    public interface PersonProxy extends EntityProxy, IPerson {
    ColorProxy getColor();
    }
    
    @ProxyFor(Color.class)
    public interface ColorProxy extends EntityProxy, IColor {
    String getColor();
    }
    

Funguje to iba vtedy, keď tieto proxy použijem ako návratové typy parametrov RequestContext, ale keď sa pokúsim odovzdať proxy ako typ argumentu, ako napríklad:

Request<Void> persist(PersonProxy personProxy);

Zobrazuje sa mi UnsupportedOperationException:

java.lang.UnsupportedOperationException: com.example.IColor
at com.google.web.bindery.autobean.shared.ValueCodex.getTypeOrDie(ValueCodex.java:375)
at com.google.web.bindery.autobean.shared.ValueCodex.decode(ValueCodex.java:299)
at com.google.web.bindery.requestfactory.shared.impl.EntityCodex.decode(EntityCodex.java:107)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor$1.visitReferenceProperty(SimpleRequestProcessor.java:545)
at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.traverseProperties(ProxyAutoBean.java:324)
at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.traverse(AbstractAutoBean.java:166)
at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.accept(AbstractAutoBean.java:101)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.processOperationMessages(SimpleRequestProcessor.java:524)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:218)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:135)
at com.google.web.bindery.requestfactory.server.RequestFactoryServlet.doPost(RequestFactoryServlet.java:133)

Problém je v tom, že GWT „neprepisuje“ getry, berúc do úvahy nielen PersonProxy

ColorProxy getColor();

ale aj jeho náprotivok nadtypu

IColor getColor();

hádzať túto výnimku, pretože nemôže nájsť typ domény pre IColor.

Problém je v tom, že com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.calculateData (trieda beanType) getre sú vyplnené pomocou beanType.getMethods () a nevidím žiadny spôsob, ako upraviť toto správanie.

Existuje spôsob, ako dosiahnuť, aby gwt používal iba najšpecifickejší getter?

Ďakujem!

odpovede:

0 pre odpoveď č. 1

Myslím, že každé zdedené rozhranie musí byťrozšíriť z EntityProxy alebo ValueProxy. Toto je takmer zaručene problém, ktorý máte. Používate validátor požiadaviek? Zdá sa, že by to spôsobilo chybu skôr, ako by ste mohli spustiť kód?


0 pre odpoveď č. 2

Aké je vaše zdôvodnenie zdieľania kódumedzi klientom a serverom? predpokladom Request Factory je, že oddeľuje vášho klienta od servera. Na klientovi používate ľahké rozhrania, ktoré replikujú štruktúru na strane servera a umožňujú vám tak oddeliť tieto dva záujmy.

Na serveri môžete mať všetky anotácie veľkej váhy, všetky druhy závislostí a na klientovi.

Ďalšia vec, ktorú treba mať na pamäti, je táto žiadosťtováreň zaobchádza s vašimi klientmi (rozhraniami) inak a prechod je riadený. ​​To znamená, že stromom na klientovi môžete prechádzať, iba ak ste už požiadali o načítanie referencie RF. Uctievanie rozhrania na klientovi by bolo problematické.