Smartgwt RestDataSource com SpringMVC e cross-client
Depois de muito trabalho, tenho um aplicativo de serviços da web de back-end existente que é alimentado por Spring-RS, Spring MVC, controladores Spring e esses controladores do usuário Jackson na estrutura Spring para converter respostas em JSON.
Aqui faz parte do WEB-INF / myproject-servlet.xml
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd"></constructor-arg>
</bean>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes" value="application/json"/>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonHttpMessageConverter" />
</list>
</property>
</bean>
Este aplicativo de serviços da Web funciona muito bem! Eu posso implantar o WAR no meu tomcat local e ele é implantado bem. Eu posso testar o controlador para ter certeza de que o URL está correto e o web-app está configurado corretamente no Spring. Eu posso acessar a URL e recuperar os dados JSON exatamente como esperava. O URL é:
http://mylocalhost/myproject/invoices/invoiceId/1
devolve 1 fatura.
Agora, estou executando um aplicativo da Web do SmartGWT, a versão gratuita, e tenho um controlador RestDataScource. Já escrevi muitos aplicativos da web do SmartGWT antes, e esses aplicativos eram inclusivos: entidades, dao, camada de serviço, controladores e origens de dados. Com isso, não houve problemas entre clientes, desde que os controladores e as fontes de dados estivessem no mesmo aplicativo. E não sou contra fazer isso de novo, mas quero tentar separá-los.
Eu só recentemente vi que isso não funciona !!! Com meu aplicativo da web SmartGWT sendo executado localmente no Jetty para o modo de desenvolvimento. O URL inicial é:
http://mylocalhost:8888/myapp
E quando isso tenta chamar o back-end em
http://mylocalhost:8080/my-ws, then my listgrid gives me a warning message.
Se eu puder adicionar apenas uma linha: RPCManager.setAllowCrossDomainCalls (true); Eu adiciono isso dentro do meu RESTDataSource? Onde eu adiciono isso? E isso realmente fará tudo funcionar? Há mais alguma coisa que eu precise adicionar?
Então, eu estava olhando para XJSONDataSource e vi que precisava fazer algumas alterações no meu RestDataSource para convertê-lo em um XJsonDataSource. Há ótimas informações aqui com outra postagem e eles sugeriram adicionar:
// Where do I put this line? the controller or the datasource
String callbackString = request.getParameter("callback");
// Where do I put this code? the controller or the datasource
response.setContentType("text/X-JSON");
response.getWriter().write( callbackString + " ( " + JSONstring + " ) " );
response.setStatus(HttpServletResponse.SC_OK);
Eu não tenho certeza onde esse código vai, então eu preciso de alguma ajuda extra lá. Tanto quanto o controlador vai, aqui é parte do que parece:
@RequestMapping(value = "/invoiceId", method = RequestMethod.GET, headers = "Accept=application/json")
public @ResponseBody
InvoiceDetailDTO getContactTypeByUserId(@RequestBody String invoiceNumber)
{
InvoiceDetailDTO invoiceDetailDto = invoiceService.getInvoiceDetail(invoiceNumber);
// invoiceDetailDto is automatically converted to JSON by Spring
return invoiceDetailDto;
}
No código acima com "pedido" e "resposta" tem que ir para o controlador, como faço para isso?
Em última análise, eu adoraria apenas usar o meu RestDataSource e ajustá-lo para trabalhar do jeito que eu quero, e ignorar qualquer um desses problemas entre sites. Se eu precisar usar XJSONDataSource, preciso apenas de alguns bons exemplos reais e de um exemplo de como ajustar meus controladores, se necessário.
Obrigado!