Som en del av implementasjonen av serverbiten av WisWeb 2 har vi gjort en jobb for integrasjon GWT og Spring. I tillegg har det blitt gjort en god del på klientsiden for å integrere RequestFactory innført i GWT 2.1 mot ExtGWT. Dette har til tider vært en frustrerende opplevelse, og ønsker her å publisere noen av de løsningene vi kom frem til slik at andre slipper å oppleve den samme frustrasjonen.
For GWT sine RPC-kall ønsker vi å konfigurere plassering av endepunkter gjennom Spring-annotasjoner. Dette krever at vi setter opp Spring-kontrollere i stedet for GWT-servlets. Denne integrasjonen gjøres i følgende kodebit.
-
public abstract class AbstractRpcController extends RemoteServiceServlet {
-
-
private static final Log logger = LogFactory.getLog(AbstractRpcController.class);
-
private ServletContext servletContext;
-
-
@Override
-
public final ServletContext getServletContext() {
-
return servletContext;
-
}
-
-
@Autowired
-
public final void setServletContext(final ServletContext servletContext) {
-
this.servletContext = servletContext;
-
}
-
-
public abstract RemoteService getRemoteService();
-
-
@RequestMapping("/")
-
public final void request(final HttpServletRequest request,
-
final HttpServletResponse response) {
-
this.doPost(request, response);
-
}
-
-
@Override
-
public final String processCall(final String payload)
-
throws SerializationException {
-
try {
-
RPCRequest rpcRequest =
-
RPC.decodeRequest(payload, this.getRemoteService().getClass());
-
String result =
-
RPC.invokeAndEncodeResponse(this.getRemoteService(),
-
rpcRequest.getMethod(), rpcRequest.getParameters());
-
return result;
-
} catch (IncompatibleRemoteServiceException ex) {
-
logger.error("Caught an exception", ex);
-
return RPC.encodeResponseForFailure(null, ex);
-
} catch (Exception ex) {
-
logger.error("Caught a generic exception", ex);
-
return RPC.encodeResponseForFailure(null, ex);
-
}
-
}
-
}
Selve kjernen her er den siste metoden. Her rutes en GWT-service inn til GWT sin implementasjon av RPC-behandling. Dette sørger for en sømløs integrasjon mellom GWT og Spring. Referanse til GWT-service er abstract, da hver modul-implementasjon bruker sin egen service.
-
@Controller
-
@SystemController
-
@RequestMapping("/rpc/contact")
-
public class ContactRpcController extends AbstractRpcController {
-
-
private ContactService contactService;
-
-
@Autowired
-
public final void setContactService(final ContactService contactService) {
-
this.contactService = contactService;
-
}
-
-
@Override
-
public final RemoteService getRemoteService() {
-
return this.contactService;
-
}
-
}
Dette er en implementasjon av en modul-spesifikk RPC kontroller. Kontakt-service hentes her fra Spring sin kontekst, og gis tilbake til den abstrakte implementasjonen ved behov. Dette gjør det raskt og enkelt å legge til services for andre moduler.
|