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ď č. 1Myslí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é.