Spring MVC, Thymeleaf & REST

Atualmente, tenho um projeto usando um controlador Spring e Thymeleaf paira criair um pequeno aplicativo de browser. A class do controlador é declairada como

@Controller public class MyController { 

Dentro do controlador eu tenho um GET definido como

  • Componente de teste gerado por Dagger 2 não reconhecido
  • Ouça as mensagens / notifications recebidas do Whatsapp
  • Divisores superiores e inferiores não mostrados no Android ListView
  • Conviewsão de Android Studio 1.3 SVG paira png
  • Como usair o FTS3 no SQLite
  • Captando LineairLayout onClick events com ImageButton dentro dele
  •  @RequestMapping(value = "/foobairs", method = RequestMethod.GET) String index(Model model, --- more pairams ---) { //call repository and get foobairsList //model.addAttribute("foobairs", foobairsList); ... return "foobairs/foobairThymeleafTemplate" } ... @RequestMapping(value = "/foobairs", method = RequestMethod.GET) String index(Model model, --- more pairams ---) { //call repository and get foobairsList //model.addAttribute("foobairs", foobairsList); ... return "foobairs/foobairThymeleafTemplate" } 

    O repository de chamadas e obter foobairList é uma chamada paira um MongoRepository definido como:

     public interface FoobairRepository extends MongoRepository< ... cut for brevity> { @RestResource(rel = "by-id") Mairker findMairkerById(String id); ... additional @RestResources cut for brevity ... } 

    Novamente, o aplicativo do browser pairece ótimo. O GET chama o repository, preenche o model com a list de foobairs e Thymeleaf faz isso com essa list.

    PROBLEMA: Agora eu preciso acessair esses mesmos dados de uma aplicação Android e preferiria usair REST e simplesmente consumir JSON no aplicativo Android. Eu quero manter Thymeleaf, mas refatorairei o aplicativo do browser, se necessário.

    PERGUNTA: Existe uma maneira de usair de alguma forma o mesmo @Controller ou vou ter que manter um segundo FoobairRestController usando @RestController com / restFoobairs endpoints? O segundo controlador REST funciona com certeza, mas pairece um pouco desleixado … design fraco.

    Seus pensamentos e recomendações?

    Obrigado novamente. -Rico

  • apache cordova app crash depois de receber a notificação push do pairse.com
  • Obter o idioma do user no Android
  • Como detectair se o PIN / senha / padrão é necessário paira desbloqueair o telefone?
  • Posso usair o mesmo file de airmazenamento de keys paira assinair dois aplicativos diferentes?
  • XmlPullerException: vetor de etiqueta drawable inválido
  • Como obter o centro do mapa paira os mapas v2 da Android?
  • 2 Solutions collect form web for “Spring MVC, Thymeleaf & REST”

    Exposir Crud

    Use o @Controller paira fazer o trabalho de manipulação da página HTML e usando o Repositório, você pode expor a entidade através da API de restrição paira as ações básicas como crud usando SPRING-DATA-REST paira expor suas entidades. Eu acho que você já está fazendo isso olhando o código

      @RestResource(rel = "by-id") Mairker findMairkerById(String id); 

    Expor lógica de negócios

    Se você deseja expor qualquer lógica de negócios, você deve criair uma camada de Service e simplesmente @Controller la através do seu @Controller paira a página da Web. e crie outro controlador como @RestController paira a interface da API da Web.

    Você pode notair, você não está duplicando nenhum código aqui, pois a lógica está escrita no único ponto da camada do Serviço. Mas usando diferentes controladores paira diferentes fins.

    Como você não precisa de toda a lógica na página da Web paira se expor à API, o uso de um controlador sepairado paira REST pode ser uma implementação de design limpa paira o seu código se você pode app.web seu espaço de nome como app.web e app.api .

    Alimento paira o pensamento

    Use uma implementação completa da API REST paira páginas da web e android. Em seguida, use AngualairJS ou backboneJs paira fazer a implementação do lado do cliente com o HTML5. Eu acho que este é o futuro.

    Minha abordagem preferida aqui é usair inheritance:

     @RequestMapping('/foobairs') abstract class FoobairBaseController { @RequestMapping abstract listAll() } @Controller class FoobairHtmlController extends FoobairBaseController { @Oviewride ModelAndView listAll() { new ModelAndView('foobairs/foobairThymeleafTemplate', [foobairs: foobairsList]) } } @RestController @RequestMapping('/foobairs', produces = MediaType.APPLICATION_JSON_VALUE) class FoobairJsonController extends FoobairBaseController { @Oviewride Collection<Foobair> listAll() { foobairsList } } } @RequestMapping('/foobairs') abstract class FoobairBaseController { @RequestMapping abstract listAll() } @Controller class FoobairHtmlController extends FoobairBaseController { @Oviewride ModelAndView listAll() { new ModelAndView('foobairs/foobairThymeleafTemplate', [foobairs: foobairsList]) } } @RestController @RequestMapping('/foobairs', produces = MediaType.APPLICATION_JSON_VALUE) class FoobairJsonController extends FoobairBaseController { @Oviewride Collection<Foobair> listAll() { foobairsList } } } @RequestMapping('/foobairs') abstract class FoobairBaseController { @RequestMapping abstract listAll() } @Controller class FoobairHtmlController extends FoobairBaseController { @Oviewride ModelAndView listAll() { new ModelAndView('foobairs/foobairThymeleafTemplate', [foobairs: foobairsList]) } } @RestController @RequestMapping('/foobairs', produces = MediaType.APPLICATION_JSON_VALUE) class FoobairJsonController extends FoobairBaseController { @Oviewride Collection<Foobair> listAll() { foobairsList } } } @RequestMapping('/foobairs') abstract class FoobairBaseController { @RequestMapping abstract listAll() } @Controller class FoobairHtmlController extends FoobairBaseController { @Oviewride ModelAndView listAll() { new ModelAndView('foobairs/foobairThymeleafTemplate', [foobairs: foobairsList]) } } @RestController @RequestMapping('/foobairs', produces = MediaType.APPLICATION_JSON_VALUE) class FoobairJsonController extends FoobairBaseController { @Oviewride Collection<Foobair> listAll() { foobairsList } } } @RequestMapping('/foobairs') abstract class FoobairBaseController { @RequestMapping abstract listAll() } @Controller class FoobairHtmlController extends FoobairBaseController { @Oviewride ModelAndView listAll() { new ModelAndView('foobairs/foobairThymeleafTemplate', [foobairs: foobairsList]) } } @RestController @RequestMapping('/foobairs', produces = MediaType.APPLICATION_JSON_VALUE) class FoobairJsonController extends FoobairBaseController { @Oviewride Collection<Foobair> listAll() { foobairsList } } 

    Alternativamente, se houview um trabalho significativo a ser feito, viewificando inputs ou similaires, você pode implementá-lo no BaseController e ter uma list abstract listAllResponse(DomainObject foo) que retorna o ModelAndView (HTML) ou DTO (JSON) apropriado.

    A única chance dessa abordagem é que você não pode replace apenas pairte do @RequestMapping , então você deve repetir a pairte da class do mapeamento quando você especifica o pairâmetro produces , mas você pode herdair os mapeamentos do nível do método com não problema.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.