Estrutura do serviço RESTful com Java Spring for Beginner

12

Sou relativamente novo em termos de habilidades de desenvolvimento web em Java. Eu tenho um projeto que acho que seria um bom candidato para um serviço RESTful do pouco que eu entendo sobre APIs. Estou tentando entrar em detalhes de como isso deve ser estruturado, mas não estou realmente chegando a lugar algum em termos de pesquisas no Google e lendo o material que já tenho. Espero que este post traga alguma validação e / ou redirecionamento em termos de meu conhecimento e suposições sobre este tópico.

Minha suposição atual é que meu serviço RESTful terá a seguinte estrutura:

  • Dados do banco de dados (SQL).
  • Um ORM (estou usando um ORM relativamente impopular chamado CPO, mas isso seria substituído pelo Hibernate pela maioria das pessoas).
  • Uma classe de gerenciador Java com métodos que conversam com o ORM para obter os dados
  • Uma classe / classes de controlador Java que manipula o mapeamento de solicitações e usa @ResponseBodypara direcionar / manipular a URL e as ações de como os dados são manipulados por verbos HTTP ( http://mysite.com/computers/dell pode ser GETsolicitada com a palavra "dell" sendo o URL um parâmetro que retornará uma matriz JSON de informações sobre computadores da dell).
  • Esse serviço deve ser feito com o Spring Boot ou, de alguma forma, poder ficar sozinho e ser independente de qualquer outro aplicativo.

Agora, assumindo que o exposto acima está correto, eu teria (em um nível muito básico) um serviço RESTful que qualquer aplicativo pode usar para consumir e usar dados.

Digamos que eu tenha meu aplicativo da web. Digamos que eu esteja criando um aplicativo Web sobre informações de hardware de computador e usando o Spring para criar esse aplicativo Web. Aqui estão minhas suposições:

  • Eu teria várias visualizações como JSPs, com as JSPs com HTML, CSS e JavaScript incluídas. O JavaScript manipularia chamadas AJAX para o controlador deste aplicativo, conforme necessário (abaixo).
  • Esse aplicativo da Web também teria seu próprio controlador para lidar com as solicitações e o roteamento de URL do aplicativo, e o controlador usaria, digamos, o ModelAndViewobjeto ou algo nesse sentido para "conversar com" o controlador do serviço RESTful, obter os dados que estão sendo passados , passe esses dados de volta para a exibição (Javascript, JSP, etc ...) para exibição.

Estou no caminho certo, aqui? Entendo que também há um aspecto de autenticação nos serviços RESTful, mas ainda não estou lá conceitualmente (e meu projeto será usado em uma rede privada, portanto a segurança não é uma prioridade neste momento).

Qualquer insight, crítica, conhecimento, feedback ou esclarecimento é muito apreciado.

aCarella
fonte

Respostas:

19

Aqui está um dos meus exemplos favoritos de estrutura para seu aplicativo de descanso de primavera.

1. Separação de camadas, cada camada é um módulo / projeto individual

  • API REST
    • Empacotado como guerra (pode ser jar se você estiver usando o boot de primavera com o servidor incorporado. O documento de boot do Spring explica claramente como implantar o chamado jar uber . É muito simples.)
    • Possui controladores de descanso que manipulam solicitações / respostas
    • depende do módulo de serviço abaixo
  • Serviço
    • Embalado como jar
    • Abstrações da lógica de negócios, essa camada não faz ideia de como se comunicar com a fonte de dados.
    • Será conectado automaticamente nos controladores restantes
    • Depende do módulo DAO / Repositório abaixo
  • DAO / Repositório
    • Embalado como jar
    • Fala diretamente com a fonte de dados, possui operações comumente conhecidas como CRUD. Pode ser simples acesso a jdbc, JPA ou até arquivos.
    • Depende do módulo de domínio abaixo
  • Domínio
    • Embalado como jar
    • Ele possui seus modelos de domínio, normalmente classes POJO. Se você estiver usando ORM, eles são entidades ORM.
    • Também poderia ter DTO (Data Transfer Object), que ainda está em debate. Use-o ou não, é sua ligação.
  • Você pode adicionar mais módulos, como utilitário, integração de terceiros, etc. mas os itens acima são altamente recomendados.

2. Ferramentas de Gerenciamento de Compilação / Dependência (IMHO muito necessário)

Existem muitos deles, a pesquisa no Google mostrará a você. Eu pessoalmente gosto do Maven com a Spring. Simplesmente funciona para a estrutura do projeto acima.
Observe também que, se você estiver usando o maven, há um módulo pai que agrega todos os módulos discutidos na seção 1. Todos os módulos de marcador também correspondem aos módulos do maven.

3. Reflexões sobre seu projeto em particular

Como você está usando o REST, eu recomendo que você NÃO use o JSP como sua visualização. Você pode usar HTML5 + Javascript simples ou alguma estrutura popular como o AngularJS como sua visualização.
Se você insistir em usar JSP, precisará introduzir outra guerra (aplicativo da web) que tenha controladores e JSPs. O controlador obterá os dados (normalmente formato Json / xml) e os analisará em seus modelos (POJO) para que seu JSP possa obtê-los do seu controlador e fazer a exibição. A publicação de dados do JSP é o inverso, omiti aqui.

Ele não está nem perto de um guia completo, pois esse tópico é bastante amplo e depende muito de seus requisitos específicos, mas os termos incluídos aqui são suficientes para você fazer pesquisas adicionais (Google, é). Espero que isso lhe dê algumas idéias sobre como abordar.

Minjun Yu
fonte
1
Domínio geralmente é a camada que contém a lógica comercial. O domínio geralmente também é chamado de camada que contém serviços. Objetos de domínio não são POJOs simples; o objeto de domínio deve conter lógica de negócios, como validação de argumento e, como tal. Provavelmente seria melhor renomear a camada para outra coisa. A camada de repositório também é frequentemente usada para transferir dados de várias fontes para seus objetos de domínio.
Andy
Os módulos Serviço e Repositório também serão projetos Spring?
Glenn Van Schil 6/03/2017
1
@GlennVanSchil Não, não é necessário que os projetos Spring sejam executados quando todo o projeto for construído, a camada de repo / service será incluída no caminho de classe. O @Autowireirá funcionar como resultado.
Minjun Yu
@MinjunYu Obrigado pela resposta clara! Mas o seu repositório / serviço precisa de uma mola como dependência importante para as anotações de Serviço, Repositório ou Componente, estou certo?
Glenn Van Schil
1
@GlennVanSchil Se você colocar todas as dependências do spring maven no pom.xml do módulo pai, não será necessário adicionar nenhuma dependência relacionada à primavera nos módulos filhos (módulos de repo / service). Esta é apenas uma maneira de fazer o layout de projetos de múltiplos módulos na primavera. O objetivo é organizar seu código. Se o seu projeto não for tão grande e não sofrer alterações no futuro próximo, você poderá combinar o domínio, repo, serviço no mesmo módulo chamado "núcleo". Parece ainda mais limpo.
Minjun Yu
2

Ao concordar com a maioria das respostas do @ Minjun.Y, acho que adotaria uma abordagem um pouco diferente da camada REST e da página da Web. Pela minha leitura da sua pergunta, acho que você deseja expor uma interface da Web e uma interface REST ao mundo externo. Há pouco a ganhar com a leitura de POJOs do banco de dados, transformando os dados em JSON e, em seguida, novamente em POJOs para consumo por JSPs.

Eu preferiria que a camada de serviço fizesse todo o trabalho real e adicionasse camadas de "apresentação" separadas para o aplicativo Web (JSPs) e o controlador REST. Esses seriam controladores separados, nos quais o serviço seria injetado. Como alternativa, escolha apenas um serviço REST e construa toda a lógica de apresentação no lado do cliente, conforme a resposta anterior.

Além disso, eu não sou um grande fã dos módulos Maven. A maneira como nossa loja Java implementaria seu projeto seria fazer lançamentos regulares da camada de serviço e depois tornar as camadas de apresentação dependentes do lançamento mais recente. Há espaço para discussão sobre isso, mas certamente funciona para nós. Teríamos a interface da web e as interfaces REST como projetos Maven separados, pois eles normalmente vivem em arquivos .war diferentes e, portanto, exigem implantação separada.

BTW, eu reforçaria a necessidade de atualizar as ferramentas de gerenciamento de compilação e dependência. Depois que seu projeto crescer para um tamanho razoável, você precisará deles. Ferramentas gratuitas como Maven, Jenkins e Nexus tornam o gerenciamento de versões menos um problema.

kiwiron
fonte