Aplicação Web Completa: Angular Twitter Bootstrap Spring MVC, Data e Security

Utilizando o SpringData como Repositório (DAO); criar o Serviço dos Usuários

Nesse post utilizaremos o incrível e prático framework Spring Data. O interessante desse framework é que toda a parte de banco de dados fica por conta do Spring. Não haverá a necessidade de criar um DAO Abstrato e coisas do tipo.

Os repositórios devem ser criado no pacote: “uaihebert.repostiory”. Os serviços devem ser criados no pacote: “uaihebert.service”.

A primeira configuração para o Spring Data foi vista no arquivo “spring-jpa.xml” onde é indicado ao Spring o pacote das interfaces que serão utilizadas, o EntityManagerFactory e o datasource:

<jpa:repositories base-package="uaiContacts.repository"
                  entity-manager-factory-ref="entityManagerFactory"
                  transaction-manager-ref="transactionManager"/>

A idéia do SpringData é: “crie uma interface do que você quer, e deixe que nós faremos a implementação”. É exatamente isso que o SpringData faz, pede apenas que o desenvolvedor crie uma interface, o resto ele fará.

Após o login do usuário, realizado pelo SpringSecurity,  existe um interceptor (veremos mais a frente) que fará a consulta dos dados do usuário pelo email no banco de dados . Uma consulta simples para buscar as informações como nome, email, perfil, etc.

Vamos ver a como ficará a busca do usuário por email na interface UserRepository:

public interface UserRepository extends CrudRepository<User, Integer> {
    User findByEmail(String email);
}

Essa interface o maior contato que teremos com o banco de dados em nosso projeto, ou quando um projeto utiliza o SpringData.

Primeiro detalhe é “UserRepository extends CrudRepository<User, Integer>“. A interface CrudRepository pertence ao Spring e ela já tem todos os métodos necessários para um CRUD. Ao utilizar a interface CrudRepository é necessário informar  qual a entidade e qual o tipo do ID. Em nosso caso estamos a utilizar a entidade User que tem o ID do tipo Integer.

Segundo detalhe é o método que tem o nome “findByEmail”. Os métodos que começam por “findBy” no Spring fará com que o SpringData crie uma query baseada no que vier depois do “findBy”. Como o método se chama “findByEmail” e tem como parâmetro “String email” o SpringData criará uma query parecida com: “select u from User u where u.email = ?”. Ao ver a palavra “email” descrita no nome do método o SpringData automaticamente buscará dentro da entidade um atributo chamado “email” para montar a query. Caso fosse necessário pesquisar pela idade do usuário poderia ter um método chamado “findByIdade(int idade)”.

Terceiro detalhe é que não será necessário criar uma classe que implemente essa interface. O próprio Spring fará esse trabalho e não será necessário adicionar uma classe só para isso.

E se a query fosse um pouco mais complexa, como fazer? É simples o Spring permite que você use sua própria JPQL:

@Query(value = "select u from User u join u.person p join p.dogs d")
User myComplicatedQuery();

Note que o SpringData é poderoso suficiente para entender quando ele deve ou não atuar sobre os métodos, e também permitir que o próprio usuário tenha o conforto de escrever suas queries.

O primeiro serviço a ser visto é o que consultará o usuário pelo email, logo após o login realizado com sucesso:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User findByEmail(String email){
        return userRepository.findByEmail(email);
    }
}

Note que a interface UserRepository foi injetada utilizando a anotação @Autowired. E em nenhum momento foi criada uma implementação, o próprio SpringData fará o trabalho. E para utilizar o método basta chamar normalmente sem nenhuma outra configuração ou passo necessário. É injetar a interface e começar a usar.

O serviço do usuário será chamado em um Interceptor que veremos mais a frente.

Note que neste projeto o repositório não foi exposto para outras classes, se não para seu próprio serviço. A vantagem dessa abordagem é que caso seja necessário alterar qualquer coisa no repositório isso não afetará as classes que utilizarem o serviço. Outra vantagem é que fica mais fácil de fazer testes unitários em camadas que estão isoladas.

221 thoughts on “Aplicação Web Completa: Angular Twitter Bootstrap Spring MVC, Data e Security

  1. Excelente post Hebert!

    Você indica o uso do Angular em manipulação complexa de tela(exibição/ocultação) de MUITAS partes da página? Não tornaria a camada de visão muito poluída e confusa pro web design usar?

    Parabéns pelo trabalho!

    • Igor, boa tarde.

      A vantagem do Angular em relação a webdesign é justamente que Javascript faz parte da vida de um web design.

      Nesse caso bastaria o lado servidor enviar objetos com o máximo possível de valores já definidos para evitar muita lógica do lado da view.

      Por exeplo, poderíamos enviar um json já com atributos como: exibirAlerta, ocultarCampo e coisas do tipo.

      Espero ter ajudado.

      Obrigado pela visita e pelo apoio.

  2. É muito bom ver artigos/tutorias que escapam do JSF.
    No Java tem tanta coisa boa, mas nosso mercado aqui no Brasil só olha pro JSF.
    Já ouvir falar muito o povo dizendo que é por causa que o nosso mercado usa muito ele.
    Mas também acho que o mercado usa muito ele por falta de conhecimento em outras tecnologias.
    Daí o Spring MVC que é um framework muito bom, temos também o VRaptor que é o meu favorito. Além do Apache Wicket que estou trabalhando agora que é bom também.

    Parabens pelo material.
    Ainda não li por completo, mas já vi muita coisa sua e acho que esse post não vai ser diferente.

    • Lazaro, bom dia.

      Eu não culpo o mercado brasileiro pois JSF fica bem próximo a um sistema desktop. E não é necessário intervenção de design para que o projeto fique agradável ao usuário.

      Eu gosto do JSF, mas é necessário estudo para utilizá-lo bem.

      Tenho gostado muito do Spring e suas integrações. [=

      Obrigado pelo apoio e pela visita.

  3. Fico muito feliz quando vejo um post com tanta qualidade e de fácil acesso, como você já fez em outras publicações, como a do “JPA Mini Livro”, por exemplo.

    Nunca tinha tentando utilizar o Spring sem o JSF e nem sabia como utilizar o Angular.js.

    Parabéns pelo seu trabalho Hebert, estarei sempre acompanhando!

    Abraços.

    • Eu to usando Spring MVC com AngularJS desde o começo deste ano de 2013 e tenho gostado bastante.
      Com uma arquitetura semelhante a camada view fica bem independente. Em um projeto que fiz (www.caronauniversitaria.net) colocamos a parte estática do código em um cloud da Amazon aqui no Brasil para obter uma menor latência e a parte dinâmica fora do Brazil para economizar no preço. Fica muito rápido e ainda dá pra usar a API offline do html5.

      • Olá Marcos, tudo bem?

        Questão de gosto mesmo. Por exemplo, em meu trabalho todos os projetos utilizam o security e não implementam a UserDetailsService. [=

        Obrigado pela visita.

    • José, boa tarde.

      Não tenho nenhuma versão de livro online. Já deu muito trabalho só de gerar esse post, para criar qualquer tipo de mídia seria mais tempo investido… Esse post demoraria mais um mês para sair. [=

      Obrigado pela visita.

    • José, boa tarde.

      Infelizmente eu não tenho como gerar um post em duas formatações diferentes. Não tenho tempo para isso.

      Eu conheço a tubaína pois é ela que eu uso para escrever os livros da casa do código.

      Entenda que apenas para escrever o post em português e formatar leva quase um mês, e ainda preciso traduzir e formatar para inglês. Se meu trabalho fosse ser blogueiro, aí seria uma coisa a se pensar, mas o blog é apenas para passar o tempo e ajudar as pessoas.

      Obrigado pela visita.

  4. Boa tarde Hebert, tudo certo?
    Estou iniciando as pesquisas para o meu TCC e a principio havia definido que utilizaria para interface JSF e PrimeFaces, mas depois de ler aqui, fiquei com vontade em me arriscar nessas tecnologias que utilizou aqui, mas tenho receio de apanhar um pouco ;/
    Estou querendo aprender Spring MVC + Maven e parece ser o que precisava o/
    Acha que vale a pena apostar nelas?
    Abraço!

    • Olá Cezar, boa noite.

      O melhor seria você focar na tecnologia que você se sente mais confortável. O Spring é muito bom de trabalhar com ele, mas pode ser complicado as vezes.

      Aqui tem uma base boa, mas não completa.

      Te aconselho a ler um livro (mesmo que pequeno) da tecnologia que você escolher. [=

      obrigado pela visita.

  5. Mais uma vez fui surpreendido pela exelencia de um post seu Hebert.
    Ainda não fui para a pratica deste post, porém já o li calmamente e devo lhe parabenizar. São poucos os autores técnicos que conseguem ter tamanha didática.

    • Bruno, boa tarde.

      Pode ser problema de validação do próprio Eclipse. Infelizmente ele se perde as vezes. =/

      O meu também aparece essa mensagem mas não atrapalhou em nada. [=

      Até mais.

  6. Excelente tutorial Ebert.

    Só lembrando que no arquivo “context.xml” tem que alterar também (caso for utilizar o mysql) a parte de driverClassName.

  7. Estou querendo colocar um banco H2 na minha aplicação, é só alterar o context.xml ou tenho que fazer mais alguma coisa?

    Valeu

    • Hinotori,

      Você pode usar o H2 sem problemas, apenas deve alterar onde for necessário.

      Esses locais de alteração foram exibidos em todo o post.

      Obrigado pela visita.

      • Bom, acabei não fazendo em h2, tinha um banco mysql já instalado aqui e mandei bala… quer dizer, tentei mandar bala
        Antes eu tinha escrito o código, depois baixei o teu, importei o projeto pro Eclipse mas tá dando o mesmo erro:

        Caused by: javax.naming.NameNotFoundException: Name [jdbc/tomcatDataSource] is not bound in this Context. Unable to find [jdbc].
        at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
        at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158)
        at javax.naming.InitialContext.lookup(InitialContext.java:417)
        at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:154)
        at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)
        at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
        at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178)
        at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:104)
        at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105)
        at org.springframework.jndi.JndiObjectTargetSource.getTarget(JndiObjectTargetSource.java:132)
        ... 52 more

        Se quiser te mando o erro inteiro… mas tá bizarro

        • Hinotori, boa tarde

          O erro aconteceu bem antes, existe alguma configuração errada em seu datasource que ele não conseguiu ser corretamente configurado.

          Infelizmente eu não tenho aqui nenhuma configuração válida de H2 para te passar agora. =/

          Obrigado pela visita.

  8. Pessoalmente eu prefiro deixar o HTML bem desacoplado do spring mvc, ou seja, faço apenas o HTML e comunico com o servidor via REST com a ajuda do AngularJS usando $resource.
    As coisas ficam mais empolgantes quando você começa a usar a paginação do spring mvc. Pra um sistema web essa abordagem é muito rápida.

    • Marcos, boa tarde.

      A arquitetura que você propõe também é valida e muito utilizada.

      Ambas as abordagens tem suas vantagens e desvantagens.

      Obrigado pela visita.

  9. Olá novamente Hebert
    Estive fazendo alguns testes, e me surgiu uma duvida, como eu faria para implantar este projeto em um servidor de aplicação, como o weblogic por exemplo? Quais as configurações eu deveria alterar?

    • Giovane, boa tarde.

      Você deveria fazer alguma séries de alterações (vou listar abaixo o que eu consigo lembrar agora):
      1) Criar o datasource dentro do weblogic conforme ele requer
      2) Alterar as dependências do pom. Não é bom enviar uma biblioteca que já exista no servidor, ou então passar alguma configuração que faça o servidor ignorar as bibliotecas dele.

      Não sei te falar agora ao certo quais seriam as outras alterações necessárias.

      Obrigado pela visita. [=

  10. Parabéns pelo post Hebert.

    Ficou bem completo! Eu montei uma aplicação seguindo esse modelo algum tempo atrás e sofri pra juntas todas as peças do quebra cabeça de configurações e tudo mais rsrs.

  11. Hebert meu app num sai da tela de “usuário ou senha incorretos” dai fui tentar ver o log pra descobrir onde erro e num sei como faço pra ativar akela opção “format_sql” q ativava pelo persistence.xml, idéia?

    • Luciano, boa tarde.

      Veja se o nome/senha/role do usuário estão iguais aos demonstrados no post.

      Busque no google por format_sql JPA que já no primeiro resultado mostra como fazer.

      Obrigado pela visita.

      • mas Hebert todos os posts mostram o format_sql usando o hibernate.cfg.xml num teria q ser dentro do spring-jpa.xml? e da senha coloquei nos 2 campos user e em role: ROLE_USER e nd de passar.

        • Luciano, boa tarde.

          O valor é o mesmo, basta você deixar igual ao XML do persistence xml. É só adicionar a propriedade lá.

          Infelizmente não consigo pensar em nada que possa ser seu problema no momento.

          Att

          • uma pena q não rodou aki pq era exatamente o q queria para implementar meu projeto, mas vlw Hebert por ter compartilhado!!

          • Por nada. Infelizmente não tenho como te ajudar mais agora pois teria que analisar log completo, conexões e outras coisas. Agora não tenho tempo para isso.

            Sei que todos que simplesmente baixaram o projeto e rodaram igual descrito no post, funcionou sem problemas.

            Até mais.

  12. Boa tarde, viu essas pastas, por exemplo a do tomcat, conf e etc, só as pastas mesmo, elas criam sozinhas daí é só criar os xmls ou precisa criar todas as pastas e depois os xmls ?

  13. muito bom toda a serie dos posts e app completa. Mas, pq o tile se está usando o angularjs? e o angular ja tem o esquema de template. Fiquei com a duvida da real necessidade do tiles.

    • Camilo, boa tarde.

      A intenção do post foi de apenas demonstrar o Angular e sua utilização para o bind.

      Se eu fosse detalhar todo o template do Angular seriam necessárias muitas páginas adicionais.

      Infelizmente o publico alvo do blog não é só pessoas experientes, mas pessoas que estão começando também. E eu penso que é mais fácil começar tiles do que com Angular (pelo menos foi a resposta que obtive de alunos em sala da aula).

      Obrigado pela visita e pelo apoio.

  14. Hebert,

    Cara, desculpa se estou sendo chato, mas tenho mais uma dúvida

    Fui implementar métodos adicionais, como um findUsersByRole, e criei um RoleDaoImpl, que implementa RoleDAO e injeta o objeto persistido no contexto -> exemplo
    @PersistenceContext
    private EntityManager entityManager;

    Mas o CrudRepository me faz ter que implementar N métodos que eu realmente não preciso. Só existe aquela solução de criar uma query diferente na unha, não existe como usar o entityManager?
    PS: peguei o exemplo do entityManager daqui http://goo.gl/ef6hJa

    • Hinotori, boa tarde.

      Você não precisaria de usar um EntityManager, por isso te aconselho a entender melhor o conceito do SpringData.

      Se a explicação do blog não te esclareceu o suficiente, procure outras fontes de material.

      Veja que no projeto do post, o repositorio herda de uma própria interface do Spring e não foi necessário implementar método algum.

      Veja se o import do CrudRepostiory que você utilizou é o mesmo. Reforço: olhe o código do post e veja que não foi necessário implementar nenhum método.

      Pegar outros posts e tentar aplicar aqui é complicado justamente por causa das configurações utilizadas.

      Para escrever sua própria query bastaria utilizar a anotação @Query como vista aqui no post.

      Obrigado pela visita.

    • Muito bom o seu código, está de parabéns.
      só tenho uma dúvida na hora de compilar a aplicação recebo o erro:
      java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
      porém as dependências estão no pom.xml.

      Será que pode ser um bug do Maven?
      grato.

      • Flávio, bom dia.

        Você está usando um Tomcat por fora do maven? Se sim note que existem dependências que devem ser adicionadas ao tomcat, e não vão juntas do war.

        Obrigado pela visita.

  15. Bom dia amigo, muito bom seu post. Porém estou importando ele como um projeto maven e o mesmo dá um erro no arquivo spring-jpa.xml, dizendo o seguinte:

    Referenced file contains errors (http://www.springframework.org/schema/tool/spring-tool-3.0.xsd). For more information, right click on the message in the Problems View and select “Show Details…”

    já vi o datail da mensagem, porém não consegui resolver, alguma idéia ? mas uma vez obrigado.

        • Agora estou o seguinte erro ao tentar remover vários contatos:

          Controller [uaiContacts.controller.ContactsController]
          Method [public org.springframework.http.ResponseEntity uaiContacts.controller.ContactsController.delete(int,java.lang.String,int,java.util.Locale)]

          org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "undefined"

          Alguma dica?

          Obrigado.

          • Samuel, boa tarde.

            Não entendi remover vários contatos. O post mostra apenas como excluir um por vez.

            Obrigado pela visita.

          • A primeira remoção ocorre com sucesso, no entanto, se tentar remover um por um, várias vezes é lançada esta exceção, depurando o código descobri que o id está sendo enviado como undefined, por isso ocorre a exceção no backend, pois ele tenta converter a String em um id (int), segue o console do navegador:

            event.returnValue is deprecated. Please use the standard event.preventDefault() instead. jquery-1.9.1.min.js:3
            TypeError: object is not a function
            at http://localhost:8080/uaiContacts/resources/js/angular.min.js:71:287
            at http://localhost:8080/uaiContacts/resources/js/angular.min.js:142:402
            at Object.e.$eval (http://localhost:8080/uaiContacts/resources/js/angular.min.js:87:347)
            at Object.e.$apply (http://localhost:8080/uaiContacts/resources/js/angular.min.js:87:454)
            at HTMLAnchorElement. (http://localhost:8080/uaiContacts/resources/js/angular.min.js:142:384)
            at HTMLAnchorElement.b.event.dispatch (http://localhost:8080/uaiContacts/resources/js/jquery-1.9.1.min.js:3:28337)
            at HTMLAnchorElement.v.handle (http://localhost:8080/uaiContacts/resources/js/jquery-1.9.1.min.js:3:25042) angular.min.js:61
            TypeError: object is not a function
            at http://localhost:8080/uaiContacts/resources/js/angular.min.js:71:287
            at http://localhost:8080/uaiContacts/resources/js/angular.min.js:142:402
            at Object.e.$eval (http://localhost:8080/uaiContacts/resources/js/angular.min.js:87:347)
            at Object.e.$apply (http://localhost:8080/uaiContacts/resources/js/angular.min.js:87:454)
            at HTMLAnchorElement. (http://localhost:8080/uaiContacts/resources/js/angular.min.js:142:384)
            at HTMLAnchorElement.b.event.dispatch (http://localhost:8080/uaiContacts/resources/js/jquery-1.9.1.min.js:3:28337)
            at HTMLAnchorElement.v.handle (http://localhost:8080/uaiContacts/resources/js/jquery-1.9.1.min.js:3:25042) angular.min.js:61
            TypeError: object is not a function
            at http://localhost:8080/uaiContacts/resources/js/angular.min.js:71:287
            at http://localhost:8080/uaiContacts/resources/js/angular.min.js:142:402
            at Object.e.$eval (http://localhost:8080/uaiContacts/resources/js/angular.min.js:87:347)
            at Object.e.$apply (http://localhost:8080/uaiContacts/resources/js/angular.min.js:87:454)
            at HTMLAnchorElement. (http://localhost:8080/uaiContacts/resources/js/angular.min.js:142:384)
            at HTMLAnchorElement.b.event.dispatch (http://localhost:8080/uaiContacts/resources/js/jquery-1.9.1.min.js:3:28337)
            at HTMLAnchorElement.v.handle (http://localhost:8080/uaiContacts/resources/js/jquery-1.9.1.min.js:3:25042) angular.min.js:61

            DELETE http://localhost:8080/uaiContacts/protected/contacts/undefined?page=0&searchFor= 400 (Bad Request) angular.min.js:98

            Obrigado.

          • Samuel, boa noite.

            Eu testei aqui e realmente havia um problema que já foi corrigido.

            Se você atualizar seu projeto você receberá a correção.

            Obrigado pela informação. [=

          • Boa Noite Hebert, obrigado pela atenção, depois mostra p/ gente como resolveu, pensei que era ao copiar o objeto com angular.copy(contact), a documentação diz que é lançado uma exceção quando se tenta copiar um objeto idêntico:

            If source is identical to ‘destination’ an exception will be thrown.

          • Samuel, boa noite.

            Queria eu que a solução fosse algo tão bonito que estivesse na espc… foi manezada minha mesmo. >_<” Se você olhar no código antigo, tinha uma linha que fazia $scope.selectedContact = {}, mas era para ser apenas $scope.contact = {}. Sendo que no código eu também tinha uma função chamada selectedContact. Desse modo o método era sobrescrito em tempo de execução. =( Qualquer coisa, só olhar o código fonte e ver no histórico a diferença. Aproveitei e fiz uns pequenos ajustes pera deixar tudo funcionando redondo. [= Até mais. o_

          • Samuel, boa tarde.

            Fico feliz que você gostou do trabalho, qualquer outro problema é só falar. [=

            Obrigado

  16. Boa tarde,

    Para implementar um cliente Android ou outros tipos de clientes nessa sua aplicação a estrutura já suporte, ou temos que fazer mudanças?

    Att.

    • Marlon, boa tarde.

      Ao envio e recebimento de dados já está tudo pronto, se você reparar o JSON já está indo e voltando. [=

      Eu, pessoalmente, faria alguns ajustes quanto a segurança. Pois ao tentar acessar uma página privada o ideal seria que o retorno fosse apenas um código de erro (401 por exemplo), e não o redirect para a página de login.

      Obrigado pela visita.

  17. Boa noite,

    Porque você não usou HTML no lugar dos JSP?
    Dessa forma usando JSP, a renderização do HTML + Angular não é prejudicada?

    • Marlon, boa noite.

      Uma abordagem muito utilizada é ter um servidor apenas com a view HTML + Recursos e outro apenas com o back end em java.

      A performance do JSP é muito boa e nunca vi artigos relatando degradação entre JSP + Angular.

      Eu não criei um código Servidor Apache + HTML+Recursos e outro código Servidor BackEnd Java para não complicar. O conceito de biding do Angular já é complicado para quem nunca viu entender. Achei melhor dar um passo por vez, pelo menos o pessoal da turma para qual dei aula conseguiu aprender melhor.

      Obrigado pela visita.

      • Bom dia,

        Mas se for usar essa sua estrutura para Servidor + Cliente, vc recomenda fazer ambos separados ou pode trabalhar dessa forma?
        Se separar em um cliente de HTML + Angular, implementar o Spring Security nesse cliente é o mesmo caminho da forma que você implementou?
        É necessário ter o Spring Security no Backend e Frontend caso ocorra a separação?

        • Marlon, boa tarde.

          Nesse caso o SpringSecurity ficaria apenas no BackEnd e a segurança feita via TOKEN.

          Eu acharia melhor escolha separar os apenas para otimizar a performance, mas se fosse necessário para o projeto apenas.

          Creio que seria melhor validar se vale a pena ou não separar os dois de acordo com os requisitos do sistema.

          Até mais.

          • Entendi,

            Nessa sua implementação do Spring Security, eu teria problemas se eu tivesse o seguinte:
            Table Login (id, email, senha)
            Table Usuario (id_login, …)
            Table Empresa (id_login, …)
            Com essa estrutura eu conseguiria fazer query mais avançada para definir que Usuario é Role_User e Empresa da mesma forma?
            Ou eu consigo usar esse código apenas dessa forma para usar o login do Spring Security?

          • Marlon, você teria que fazer as alterações necessárias para o seu projeto. [=

            Nesse caso, te aconselho a pesquisar mais sobre multi tenanty com spring data.

            Até mais.

  18. Boa tarde Hebert, novamente aqui te incomodando… =]
    É o seguinte, não entendi a utilização deste método do HomeController:

    @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE, RequestMethod.PUT}, produces = "application/json")
    public ResponseEntity doGetAjax() {

    return new ResponseEntity(HttpStatus.FORBIDDEN);
    }

    Está negando acesso a o que exatamente,poderia por gentileza me esclarecer?

    Desde já agradeço.

    att,
    Samuel

    • Samuel, boa tarde.

      Esse método para caso alguém tente acessar o sistema pela página inicial por Ajax, o que não é permitido. [=

      Até mais.

  19. Em outros projetos, geralmente utilizava a seguinte implementação para converter objetos JSON com Spring, utilizando as anotações @ResponseBody e @RequestBody, retornando um ResponseMessage(ResponseMessage.Type.success, “contactAdded”);:


    @RequestMapping(value = "/contact", method = RequestMethod.POST)
    @ResponseBody
    public ResponseMessage create(@RequestBody Contact contact) {

    contactService.save(contact);

    return new ResponseMessage(ResponseMessage.Type.success, "contactAdded");

    }

    Qual a diferença e razão por se utilizar assim (ResponseEntity e @ModelAttribute, retornando um ResponseEntity(contactList, HttpStatus.OK):


    @RequestMapping(method = RequestMethod.POST, produces = "application/json")
    public ResponseEntity create(@ModelAttribute("contact") Contact contact,
    @RequestParam(required = false) String searchFor,
    @RequestParam(required = false, defaultValue = DEFAULT_PAGE_DISPLAYED_TO_USER) int page,
    Locale locale) {
    contactService.save(contact);

    if (isSearchActivated(searchFor)) {
    return search(searchFor, page, locale, "message.create.success");
    }

    return createListAllResponse(page, locale, "message.create.success");
    }

    Abraços…

    • Samuel, boa tarde.

      É questão de arquitetura que leva a qual abordagem utilizar. [=

      Existem pequenos detalhes que faz a escolha pender para um lado ou para o outro, mas seria muito texto que teria que colocar aqui para explicar agora.

      Quem sabe algum dia eu ñ escrevo um post sobre isso. [=

      Obrigado pela visita

      • Certo, lendo a documentação vi que o ResponseEntity é similar a @ResponseBody, com a vantagem de conseguir acessar ao cabeçalho da solicitação:

        The HttpEntity is similar to @RequestBody and @ResponseBody. Besides getting access to the request and response body, HttpEntity (and the response-specific subclass ResponseEntity) also allows access to the request and response headers

        Obrigado e abraços.

  20. Boa Tarde, estou tentando executar o mesmo projeto, removendo o jsp e Templating em Tiles e utilizando o router provider do Angular + html, como ficaria o retorno do ModelAndView?


    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView welcome() {
    return new ModelAndView("welcomePage");
    }

    Obrigado.

    Abs.

    • Samuel, boa tarde.

      Nesse caso o controle das páginas ficaria pelo angular e o spring apenas retornaria as informações.

      Esse código que você citou serve apenas para indicar ao Tiles qual a página deve ser exibida.

      Obrigado pela visita.

  21. Cara, gosto muito dos seus artigos e já comprei um dos seus livros.
    Seria bacana você fazer um livro sobre Spring, você explica muito bem :)

  22. Boa noite,

    Estou implementando meu login via Java.
    Ou seja, no arquivo de configuração eu aponto para o meu bean CustomAthenticationProvider que tem uma anotação do tipo @Component e faz as trativas de usuario e senha e de gerar o token.
    Só que estou com problemas na criptografia da senha, a mesma no banco é MD5.
    Preciso que o spring pega a senha digitada no formulário e envie via MD5 para o meu bean.

    Eu coloquei as seguintes tag’s, só que não resolveu:

    • Marlon, boa noite.

      Aqui no blog ñ é um bom lugar para analisar código, em geral ele nem aceita código.

      Post no GUJ que alguém te ajudará.

      Obrigado pela visita.

  23. Bom dia,

    Não entendi muito bem o motivo do LoginInterceptor.
    Se na autenticação via spring ele salva o usuário logado na sessão, qual o motivo de mandar um objeto com todas informações do usuário para a sessão?
    Seria para economizar consumo de serviço ao buscar as informações da sessão ao invés do serviço?

    • Marlon, boa tarde.

      Os dados do usuário são informações que ñ são constantemente atualizadas, por isso estão em memória.

      Com isso não precisammos ir a todo momento buscar esse dado no banco de dados.

      Obrigado pela visita.

  24. Hebert, parabéns pelo tutorial, ficou show. Eu tenho uma dúvida

    na função js resetContact

    $scope.resetContact = function(){
    $scope.selectedContact = {};
    };

    dá no mesmo se for assim ??

    $scope.resetContact = function(){
    $scope.contact = {};
    };

  25. Porque você usa um VO para fazer o retorno dos resultados do banco?
    Não seria corre em um findAll, ao retornar vc retornar um List ao invez de um ContactListVO?

    Eu utilizei o VO, mas tive problemas ao acessar o serviço (Mapeado no Controller), pois o mesmo retornou algo assim: {“contacts”: [{“id”:1,”name”:”Valter”}]}

    Ao receber no function do Angular um data, ele espera algo desse tipo para interar no “$scopo.contacts = data;”:
    {“id”:1,”name”:”Valter”}

    • Marlon, boa tarde.

      Teve um livro que li que dizia ser boa prática ter uma classe encapsulando o resultado, e eu tenho gostado dessa prática. [=

      Obrigado pela visita.

  26. Excelente post.

    Me permita fazer uma pergunta um pouco fora do contexto?

    Não achei nenhum exemplo, mas como percebi que você tem ampla experiência com Spring talvez possa ajudar.

    O que acontece é que quando tenho no mesmo formulário duas classes com campos de mesmo nome, o “Spring” concatena as duas separando os valores com “,”.

    O erro também ocorre se eu tiver, por exemplo, uma classe Pessoa, que tem relacionamento com uma classe Telefone do tipo 1-N(uma pessoa tem vários telefones). Mesmo nesse caso o Spring concatena os valores dos N telefones com “,”.

    Você teria alguma ideia do porque isso ocorre?Já viu esse erro?

    Obrigado e parabéns pelo post.

    • Alan, boa noite.

      Nesse caso é comportamento de HTML padrão. Quando você tem dois campos com mesmo nome, ele criará um array para você dependendo do tipo.

      Tem alguma coisa errada na hora que você monta o JSon. Ou você utilizar o angular/jquery e submete do jeito correto, ou você faz o bind utilizando as tags do spring no form.

      Obrigado pela visita.

      • Então uaihebert, só me extendendo no problema mais um pouco, já estou utilizando bind, abaixo é o código HTML do meu formulário, sendo que telefoneResidencial e telefoneComercial são instâncias diferentes da mesma classe mas com nomes diferentes, logo abaixo do html tem o trecho do meu controller que eu defino esses dois binds:

        **CÓDIGO HTML**

        Telefone Residencial

        <input type="text" name="” value=”” />

        <input type="text" name="” value=”” />

        **CÓDIGO DO CONTROLLER**


        uiModel.addAttribute(“telResidencial”, new Telefone());
        uiModel.addAttribute(“telComercial”, new Telefone());

        • Alan, boa noite.

          Desculpe, mas aqui não é bom para se postar/analisar códigos.

          Poste sua dúvida no GUJ que alguém vai te ajudar.

          Obrigado pela visita.

  27. Boa tarde,

    Gostaria de dar uma dica que seria mais práticas nos exemplos com banco de dados, deixandos os exemplos totalmente portáveis. Seria usar banco de dados em memória como o HSQLDB.

    • Filipe, boa tarde.

      Obrigado pela dica.

      Antigamente eu fazia com HSQLDB alguns posts, mas o pessoal sempre perguntava sobre postgres ou mysql.

      Por isso que nesse post e nos próximos eu pretendo sempre fazer utilizando esses dois.

      Para trocar para o HSQLDB não seria difícil também, basta no mesmo lugar onde tem as dicas do MySQL colocar os valores do HSQLDB. [=

      Agradeço a sua atenção. [=

    • Raphael, boa noite.

      O único motivo que eu vejo para você ñ conseguir seria a versão do eclipse ou o workspace com arquivo corrompido.

      Se você conseguiu com o m2e-wtp pode continuar feliz com ele. [=

      Obrigado pela visita.

  28. Ola Boa Tarde Hebert

    Gostei bastante do projeto do exemplo muito completo bem detalhado com varias tecnologias legais.

    Trabalho em projetos com spring e flex.

    O meu projeto rodou legal so que ao tentar fazer um cadastro para entender mais tecnologia junto com o angular.

    Só que ao tentar subir o projeto aparece este erro : tipo que não encontrou a classe Variedade. Ao tentar injetar o VariedadeRepository

    FactoryBean threw exception on object creation; nested exception is org.springframework.data.mapping.PropertyReferenceException:

    No property name found for type br.com.as.model.Variedade

    Obrigado ate++

    • Alex, boa tarde.

      Você deve criar suas classes iguais as do projeto. Seguindo todas as configurações.

      Eu teria que analisar suas classes mas agora não tenho tempo.

      Verifique pacotes, nomes, configurações de xml.

      Att,

      • Ola Boa Noite

        Verifiquei minhas classes e detectei o erro na minha classe
        que era na minha interface VariedadeRepository.

        Tinha uma assinatura de um metodo contendo o campo name que não tinha na minha Entidade.

        Alterei e tudo OK

        Page findByNameLike(Pageable pageable, String descricao);

        Agora estou trabalhando no angular.
        Muito Obrigado ate ++

  29. Hebert,

    Porque no seu arquivo de configuração web.xml tem 2x declarado o /WEB-INF/spring/spring.xml?
    Estou reparando que no log do servidor, ele está registrando as configurações 2x e deixando muito lento o deploy. Isso não seria uma problema?

    • Marlon, boa tarde.

      Note que apenas o path está escrito em configurações diferentes.

      Faça um teste, apague uma das configurações e tente executar o projeto.

      Em minha máquina o deploy não leva mais do que 15 segundos aproximadamente utilizando o JRebel como agent (que deixa mais lento).

      Obrigado pela visita.

  30. Hebert, sempre acompanho seus post e acho sensacionais, estou com uma duvida, e gostaria de pedir sua ajuda.

    Sou estagiário e preciso realizar autenticação de usuários em um sistema que estou fazendo na empresa onde trabalho, uso o spring mvc para realizar a autenticação, a pagina de login funciona perfeitamente, tudo funciona perfeitamente, só que depois que eu fiz o Interceptor ao abrir a página para testar acontece o erro: “Esta página da web tem um loop de redirecionamento”, fiz algo de errado no Interceptor que está causando isso.

    Meu Interceptor:

    package br.com.sulamerica.semprenoar.spring;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

    public class Interceptor extends HandlerInterceptorAdapter {

    public boolean preHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler) throws Exception {
    String uri = request.getRequestURI();
    if (uri.endsWith(“Login”) || uri.endsWith(“loginUsuario”) || uri.contains(“resources”)) {
    return true;
    }

    if (request.getSession().getAttribute(“usuarioLogado”) != null) {
    return true;
    }

    response.sendRedirect(“login”);
    return false;
    }

    }

    sendo que o “Login” é a página que contem o formulário para login.
    “loginUsuario” é o nome da action do formulário de login.

    me disseram que tinha que configurar algo relacionado com a pasta “resources” que está dentro da pasta “WebContent” lá dentro tem uma pasta de nome “css” com 1 arquivo .css, mais acredito que não seja isso, como vc tem muito conhecimento nisso, gostaria de saber se poderia me dar uma dica.

    • Fellipe, boa tarde.

      Infelizmente não tenho como te ajudar agora pois teria que analisar código e não estou com tempo agora.

      Poste sua dúvida no GUJ ou no br.stackoverflow.com que o pessoal vai te ajudar.

      Obrigado pela visita.

  31. Boa Noite

    Em primeiro lugar excelentes posts aqui no seu site
    Fui rodar este projeto do angular e deram alguns erros. Primeiro abri no netbeans, rodei o limpar e contruir e ate ai tudo certo. Ao rodar o tomcat deram os seguintes erros. A criei o banco etc.

    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0′: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in ServletContext resource [/WEB-INF/spring/spring-jpa.xml]: Invocation of init method failed; nested exception is org.springframework.jndi.JndiLookupFailureException: JndiObjectTargetSource failed to obtain new target object; nested exception is javax.naming.NameNotFoundException: Name [jdbc/tomcatDataSource] is not bound in this Context. Unable to find [jdbc].

    Caused by: javax.naming.NameNotFoundException: Name [jdbc/tomcatDataSource] is not bound in this Context. Unable to find [jdbc].

    Esses tres basicamente que se repetem varias vezes. Saberia o porque disso. Agradeco desde ja

    Felipe

    • Felipe, boa tarde.

      Você deve colocar dentro do tomcat na pasta libs todas as bibliotecas descritas no pom, dentro do plugin do tomcat7.

      Obrigado pela visita e pelo apoio.

  32. Olá,
    muito bom este exemplo!
    Eu encontrei um pequeno erro de importação na classe HomeController. Segue o exemplo atualizado!
    Um grande abraço,
    Jony Ferreira

    package uaiContacts.controller;

    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;

    @Controller
    @RequestMapping(value = “/”)
    public class HomeController {

    @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE, RequestMethod.PUT})
    public String redirect(){
    return “redirect:/protected/home”;
    }

    @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE, RequestMethod.PUT}, produces = “application/json”)
    public ResponseEntity doGetAjax() {
    return new ResponseEntity(HttpStatus.FORBIDDEN);
    }
    }

    • Jony, boa noite.

      Valeu pela dica, vou atualizar lá no repositório depois.

      Obrigado pela visita, e desculpe a demora em responder. Estive muito ocupado nesse último mes.

  33. Bom,

    Primeiramente parabéns e obrigado por compartilhar seus conhecimentos com os demais… muito louvável quem foca as suas ações em repassar o conhecimento(ensinando a pescar).

    Após ler o material, resolvi fazer uma aplicação utilizando as “ferramentas” indicadas no site…enfim

    Meu problema é o seguinte: Tenho duas entidades Login e Grupos, as duas entidades possuem relacionamento bidirecional “Login Grupo”.

    Contudo na hora de listar em uma tabela a lista de usuários, o json reclama de referência cíclica…

    teria uma forma clara e se é que possível, suave hehhe de contornar isso?

    Desde já agradeço a sua atenção. Mais uma vez parabéns!

    • Pedro, boa tarde.

      Envie o objeto sem a referencia cíclica. Todas as vezes que vi isso acontecer era por que essa referencia estava aparecendo mas não era necessária.

      Faça algo como a.setB(b) e pronto. Envie o A para tela. [=

      Obrigado pelo apoio.

  34. Hébert, parabéns pelo post! Ficou muito bacana. Tive algumas dificuldades em identificar onde iriam certos arquivos e classes, mas baixei o seu fonte e consegui descobrir o que precisava.
    Não estou, porém conseguindo logar na aplicação. Criei os usuários no MySQL com a seguinte sintaxe:
    INSERT INTO angular.system_user (email, enabled, name, password, user_role) VALUES (‘user@user.net’, ‘true’, ‘user’, ‘user’, ‘USER_ROLE’);
    O usuário é criado, mas não consigo logar. Será que tem a ver com a senha não estar encriptada no BD?

    • Gustavo, boa tarde.

      Pode ser que você está tendo problemas ao iniciar o projeto. Veja os dados de conexão, pois pelo que vi você criou um schema para o banco diferente do esquema utilizado no projeto.

      Obrigado pela visita.

      Att,

      • Opa! Descobri qual era o problema. O login estava sendo feito não pelo nome de usuário, mas pelo email. Foi ajustar isso que funcionou. Porém, não consigo carregar a página de contatos agora. E não aparece nenhum erro no console. Alguma idéia de onde posso dar uma olhada nisso?

        • Gustavo, boa noite.

          Deve ser algum a diferença entre o seu código e o código do post.

          Te aconselho a baixar o código do post e comparar para ver as diferenças.

          Obrigado pela visita.

  35. Boa Noite, Hebert.

    Primeiramente, sou teu fã =]

    Estou tendo erro na hora do deploye , aparece esse erro :
    Fica informando que eu estou rodando em um JRE, mas eu coloquei default, como vc mencionou.

    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

    • Marcos, bom dia.

      Obrigado pelo apoio.

      Verifique se o seu JAVA_HOME ou o PATH está apontando para uma JDK e não uma JRE.

      Veja também o PATH da sua IDE para onde está apontando.

      Obrigado pela visita.

  36. Parabens pelo post! muito bom
    Estou usando Spring MVC e nao consigo achar uma maneira de trazer um modal do Bootstrap 3 por ajax, voce tem alguma ideia ou exemplo de como fazer isso ?

    Abraços

    Evandro Oliveira

  37. Olá Herbert tudo bem?

    Parabéns pelo blog e por esse sensacional post. Creio que a comunidade de desenvolvedores e aprendizes é muito grata por essas abordagens didáticas.

    Hebert, comecei a pouco tempo a usar o Spring e estou gostando muito da sua praticidade. Confesso que peguei seu projeto como modelo para desenvolver algo com intuito de aperfeiçoar minhas habilidades no framework.

    Tenho uma duvida que ficaria muito grato se você pudesse me ajudar.

    Criei duas tabelas relacionadas, uma denominada “Agência” e outra chamada “Login”. Sendo que uma “Agência” pode de conter um ou mais “Login” (@OneToMany), mas o problema pega na hora da criação da view, pois os dados das duas tabelas vão compor um único formulário.

    Com alguma pesquisa pude notar que não posso ter dois modelAttribute em meu form (estou utilizando as tag libs do spring), por isso adotei o . Mas creio que não obtive sucesso.

    Não sei se acabei sendo muito confuso, mas realmente não sei como tratar a persistência de dados com tabelas relacionadas no Spring.

    Obrigado pela atenção e muito sucesso!

    Abraço

    • João, boa noite.

      Desculpe mas não consegui entender seu problema. Se você notar no exemplo nem é usado um objeto de MODEL.

      Para trazer todos os dados, utiliza um JOIN FETCH na consulta que você trará também os relacionamentos.

      Obrigado pela visita

  38. Olá.. seu tutorial esta ajudando bastante, porém conforme fui fazendo, vai aparecendo alguns erros, principalmente nos imports do spring e as taglibs
    sabe como arrumar isso?

    • Ruan, bom dia.

      Mesmo com esses erros no xml, o projeto roda sem problema.

      Geralmente o Eclipse se perde nesses xmls… -_-”

      Obrigado pela visita.

      • Consegui arrumar a maioria dos erros macabros que estavam dando, só não consigo executar, ele fala que apache7:run não é compatível algo assim. acho que é porque estou usando o Windows, não achei solução ainda…
        sem o apache7 ele fala que gerou o war. mais não sei o que fazer depois. é meu primeiro contato com o maven =/

        • Ruan, bom dia.

          Problema do linux eu sei que não é. Eu não sei de onde mas não conheço o comando apache7, eu sempre usei o plugin tomcat7.

          Qualquer coisa, baixe o projeto do GIT e rode pois ele funciona sem problemas.

          Obrigado pela visita.

          • desculpa, é tomcat7 mesmo.. só me confundi… vou tentar, ja estou usando o projeto do GIT =/

            VOu tentar resolver se conseguir eu falo.

  39. Olá, Hebert! Primeiro, parabéns pelo post, muito bom! Que alterações eu tenho que fazer para rodar esse mesmo exemplo no Tomcat ou no JBoss sem executar pelo Maven?

    • Geison, bom dia.

      No caso do Tomcat você precisa copiar as bibliocas descritas no pom, dentro do plugin do tomcat, no caso do JBoss você precisa eliminar as bibliotecas que ele já tem, por exemplo, o Hibernate.

      Obrigado pela visita.

  40. Oi, primeiramente gostaria de parabenizá-lo pela iniciativa. Segui o passo a passo, e na montagem adicionava os arquivos disponibilizados no site, e chegando ao fim, me encontro com dois erros que gostaria de sua ajuda para resolução:

    01:
    O spring-jpa.xml, em sua primeira linha:
    apresenta um erro
    Multiple annotations found at this line:
    – Referenced file contains errors (http://www.springframework.org/schema/beans/spring-beans-3.0.xsd). For more information, right click on the message in
    the Problems View and select “Show Details…”
    – Referenced file contains errors (http://www.springframework.org/schema/tool/spring-tool-3.0.xsd). For more information, right click on the message in the
    Problems View and select “Show Details…”
    – Referenced file contains errors (http://www.springframework.org/schema/context/spring-context-3.0.xsd). For more information, right click on the message in
    the Problems View and select “Show Details…”

    02:
    HomeController.java
    ResponseEntity e HttpStatus não são reconhecidos.
    Multiple markers at this line
    – ResponseEntity cannot be resolved to a type
    – Method breakpoint:HomeController [entry] –
    doGetAjax()

    • Olá Debora, bom dia.

      Ficou faltando os imports no HomeController, eu acabei de ajudar lá no github.

      Com relação ao problema do XML isso não impede que o projeto funcione. Na verdade é o Eclipse que se perde e acha que tem erro. -_-”

      Obrigado pela visita.

  41. Boa tarde Hebert,

    Baixei o arquivo do GIT, mas ao executar como esta demonstrando está causando um erro.
    Se puder me ajudar.

    Obrigado desde já!

    Erro no Console:

    WARNING: Unexpected exception resolving reference
    org.postgresql.util.PSQLException: Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

    • Wellington, boa tarde.

      Deixei em sua mensagem apenas o erro que realmente importa.

      Verifique seus dados de conexão ao banco de dados: url, senha, usuario e também se seu firewall não está bloqueando conexão.

      Obrigado pela visita.

  42. Boa tarde Herbert, não é seu aniversário mas você tá de parabéns!

    Tenho uma dúvida a respeito do redirecionamento de páginas do spring:

    Se eu tiver mais de uma pasta com vários módulos no meu sistema, como eu posso fazer com que o spring redirecione para a pasta correta?

    Ex: na tela de login, ao informar o usuário e a senha, como eu posso fazer com que o spring redirecione para o módulo ao qual este usuário está cadastrado?

    Eu pensei em criar um select com os módulos e caso ele selecione tal módulo e tenha permissão para acessá-lo, o spring irá redirecionar ele automaticamente. Mas é ai que tá, como eu faço isso?

    Mais uma vez obrigado pela sua ajuda!

  43. Estou desenvolvendo uma aplicação web que vai precisar de se comunicar com android e arduino, já sigo seus posts ha algum tempo e achei esse bem interessante pelas diversas tecnologias que aborda, gostaria de saber se este post vai me direcionar no meu projeto e se posso seguir ele como exemplo?

    • Olá André, boa noite.

      Eu indico o livro Virando a Mesa com Spring, da casa do código. Eu já li, muito bom.

      Obrigado pela visita.

  44. Olá hebert,

    Estou tentando usar esse projeto como base para um que estou desenvolvendo.
    Se eu não quiser utilizar o modal para cadastrar contatos e sim uma outra página, como faço pra trafegar a mensagem de cadastrado com sucesso?

    Tentei aqui e não consegui, se você puder ajudar agradeceria muito.

    • Wellington, boa noite.

      Nesse caso você deve manter deve enviar do seu controller essa mensagem.

      Infelizmente não tenho como analisar seu código para te dar uma resposta mais precisa, mas você pode postar sua dúvida no GUJ.

      Obrigado pela visita.

  45. Olá,

    estou tentando modularizar o angular tipo mas não funciona.
    Neste tipo de projeto que você fez, obrigatoriamente tem que ser assim:html id=”ng-app” ng-app=””?

    • Wellington, boa noite.

      Te aconselho a estudar mais sobre angular e seus módulos pois eu não utilizei essa parte dele.

      Obrigado pela visita.

    • Wellington, boa noite.

      Não sei te falar ao certo sobre esse comportamento.

      Te aconselho a estudar mais a fundo o Angular e seus módulos.

      Obrigado pela visita.

  46. Boa tarde Heberte.

    Parabéns pelo post, estou seguindo-o para aprender mais sobre o spring.

    Bom, estou com um problema na aplicação (estou utilizando do git), ao rodar o comando “mvn clean install tomcat7:run”, o build da aplicação acontece normal, mas na hora de subir o tomcat aparece o seguinte erro:

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in ServletContext resource [/WEB-INF/spring/spring-jpa.xml]: Invocation of init method failed; nested exception is org.springframework.jndi.JndiLookupFailureException:JndiObjectTargetSource failed to obtain new target object;
    nested exception is javax.naming.NameNotFoundException: Name
    [jdbc/tomcatDataSource] is not bound in this Context. Unable to
    find [jdbc].

    Obrigado…

    • Olá Bruno, boa noite.

      Verifique se os dados do banco estão correto, ou se o arquivo do tomcat se encontram no pasta devida.

      Obrigado pela visita.

  47. Hebert boa tarde, estou com um problema para executar essa sua aplicação do angular js com boostrap, estou utilizando o tomcat 7 como servidor. Está aparecendo as seguintes mensagens:

    Jul 18, 2014 1:47:26 PM org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator instantiateExplicitConnectionProvider
    INFO: HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
    Jul 18, 2014 1:47:26 PM org.apache.catalina.core.StandardContext listenerStart
    Grave: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0′: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in ServletContext resource [/WEB-INF/spring/spring-jpa.xml]: Invocation of init method failed; nested exception is org.springframework.jndi.JndiLookupFailureException: JndiObjectTargetSource failed to obtain new target object; nested exception is javax.naming.NameNotFoundException: Name [jdbc/tomcatDataSource] is not bound in this Context. Unable to find [jdbc].
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:449)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4961)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5455)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in ServletContext resource [/WEB-INF/spring/spring-jpa.xml]: Invocation of init method failed; nested exception is org.springframework.jndi.JndiLookupFailureException: JndiObjectTargetSource failed to obtain new target object; nested exception is javax.naming.NameNotFoundException: Name [jdbc/tomcatDataSource] is not bound in this Context. Unable to find [jdbc].

    Obs. Tentei colocar os arquivos do postgresql no diretório do tomcat que está separado do meu eclipse, mais não funcionou tb.

    —————————

    Já descobri o problema, na hora de configurar o maven para compilar a apicação, estava digitando também a parte do mvn. Já foi resolvido, de qualquer maneira obrigado.

  48. Hebert, bom dia.

    Parabéns pela iniciativa de promover o conhecimento adquirido com muito esforço, de uma forma didática e de grande qualidade.

    Estou com um problema em relação a conversão de um objeto no formato json, que tem um atributo “date.util”. No momento que jackson converte o json para java, a data fica com o seguinte formato : Mon Dec 10 22:00:00 BRST 2007.

    O objeto enviado é o seguinte:
    {
    “apl_idaplicacao”: 5,
    “apl_nome”: “Allenfffff”,
    “apl_descricao”: “teste”,
    “apl_datacadastro”: “2007-12-11″,
    “apl_token”: “blablabla”,
    “apl_situacao”: “a”
    }

    Obs: estou usando o postman para realizar os testes.

    Preciso de uma ajuda para resolver este problema, se vc ja passo por isso me ajude por favor.

    • Vinicius, boa noite.

      Infelizmente não tenho como te ajudar, eu teria que olhar seu código e entender sua arquitetura e no momento não tenho como fazer isso.

      Obrigado pela visita e desculpe não poder ajudar.

  49. Hebert, boa noite!

    Primeiramente, parabéns pelo seu post.

    É a primeira vez em que estou usando o Maven para criar um projeto web.

    Estou com uma dificuldade, que talvez seja de iniciante.

    Como colocar no projeto que você fez todos os plugins e suas dependências.

    Depois que criei o projeto (ficou igual a sua estrutura) o pom.xml não esta da mesma forma como esta no seu, na página 4.

    Desde já agradeço.

    • Rafael, boa tarde.

      Realmente não sei te falar o que pode estar errado, eu tentei colocar o passado a passo de tudo e não deveria haver essa diferença.

      Obrigado pela visita.

  50. Olá Hebert
    Parabéns pelo post e pelo blog, tem me ajudado muito.

    Estou começando agora no mavem e tambem no spring, tenho uma duvida no trecho de dependencias do spring,
    no post você dividiu as dependencias: spring mvc, spring security etc…

    eu queria utilizar a versão atual do spring, la no site encontrei essa dependência:

    org.springframework
    spring-context
    4.0.6.RELEASE

    Minha duvida é se eu utilizar apenas essa dependência eu consigo utilizar tudo o que você colocou, Spring mvc, security etc…, ou se tenho que colocar tudo dividido como você fez e se esse for o caso o que é legal eu utilizar?

    sobre o hibernate tambem tenho a mesma dúvida…

    Agradeço se puder ajudar
    abraço

    • Thiago, boa tarde.

      Não sei te falar o que acontecerá se você utilizar versões diferentes.

      Eu espero que não quebre, mas se quebrar eu não sei te falar o que é.

      Obrigado pela visita.

  51. Caríssimo Hebert,

    Primeiramente gostaria de agradecer ao excelente tutorial! Hoje em dia são poucos os que escrevem de maneira tão didática e com tanta qualidade.. Realmente show de bola!
    Implementei o código inteiro, e rodou tudo tranquilo. Bom, tive a ideia de atualizar todas as bibliotecas no porn, colocar tudo na última versão, e aí surgiu meu problema, após fazer isto ocorreram diversos erros, alguns até consegui corrigir, outros não.
    Você recomenda fazer esta atualização? Ou acha melhor trabalhar com estas versões aí mesmo? Vou começar um projeto novo, e gostaria de usar as últimas versões de tudo.

    Obrigado pela atenção!

    • Fernando, boa tarde.

      Honestamente eu não faria isso se não tivesse o total domínio dessas ferramentas.

      Não sei te falar exatamente o que mudou de uma versão para a outra. Em alguns frameworks isso pode impactar até o comportamento da ferramenta.

      Att,

  52. Hebert, parabéns pelo trabalho! Artigo excelente.
    1- ao invés do jackson poderia ser o gson do google, ou eles não são equivalentes?
    2- os repositórios não têm implementação (apenas interface), mas eles poderiam ter? (imagino que se tiver um método que fuja um pouco do crud sim né?)
    3- os serviços não têm interfaces, poderiam ter?

    • Rafael, boa tarde.

      1) Honestamente nunca usei o GSon produndamente para esse tipo de ação, e não sei te falar como funcionaria a integração dele com o Spring.

      2) Repositório, até onde sei, você só pode ter métodos puros ou anotados com @Query. Essa implementação teria que ficar do lado de quem chamada seu repositório. Nesse caso eu adicionaria uma camada só para isso.

      3) Sim, poderiam. Eu não coloco para evitar verbosidade. [=

      Obrigado pela visita.

  53. Olá Hebert, também gostaria de lhe parabenizar pelo excelente post. Ficou excelente, trata de frameworks do momento e os expõe com ótima didática.

    Analisando sua arquitetura pensei em desacoplar ainda mais a camada client da camada server. Na camada cliente poderiamos ter HTML+CSS+JS com AngularJS acessando a camada server que disponibilizaria serviços REST através do consjunto de módulos do Spring (CORE+MVC+DATA).
    A dúvida é se você já utilizou algo semelhante?No caso de sim, como fez para tratar questões de internacinoalização e templates da camada cliente apenas utilizando HTML e AngularJS?No caso sem fazer uso de recursos do Java como a internacionalização provida pelo Spring e o serviço de templates do Tiles.

    Abraço.

    • Olá Juliano, boa tarde.

      Infelizmente não sei te falar como esses requisitos ficariam do lado do Angular.

      Desculpe não ter como ajudar.

      Obrigado pela visita.

  54. Hebert,

    Eu estou tendo problemas para exportar o arquivo war usando o maven ou o próprio eclisep por causa dessa linha no pom.xml do tomcat:

    ${basedir}/src/main/tomcat/conf

    Depois que eu exporto o meu .war, o arquivo context.xml dentro dessa pasta não vai para o meu .war e o tomcat remoto não consegue fazer deploy da aplicação porque não consegue encontrar seu arquivo de contexto.

    Você consegue me ajudar?
    Já estou a quase 2 semanas tentando efetuar o deploy dessa aplicação.

    Atenciosamente,
    Marlon Maxwel

    • Marlon, boa tarde.

      Esse arquivo não é enviado para o Tomcat. Note que o maven nem reconhece essa pasta como uma pasta de configuração, ela é usada apenas no plugin.

      Copie o código do datasource de dentro do arquivo context.xml e coloque no arquivo context.xml, dentro de onde se declara resources (tem um exemplo dentro desse arquivo).

      Obrigado pela visita.

      • Hebert,

        Você está dizendo que se eu pegar esse context.xml que está na pasta tomcat/conf e colocar ele dentro da META-INF vai funcionar?

        Atenciosamente,
        Marlon Maxwel

        • Marlon, boa tarde.

          Não, eu não disse isso. Eu disse para você pegar o resource encontrado no arquivo context.xml do projeto, e colocar esse conteúdo dentro do arquivo context.xml do seu tomcat. Ele fica no diretório TOMCAT/conf/context.xml

          Obrigado pela visita.

  55. Hebert, parabens pelo seu tutorial esta me ajudando muito, mas estou com duas duvidas.
    1- Qual seria o usuario e senha para entrar no sistema?
    2- Eu tenho uma função no Banco que me dá um retorno de pesquisa em que não preciso colocar acentos e/ou maiuscula/minuscula EX: João, Joao, JOÃO, etc.
    Isso seria possivel ser feito com o Spring Data ou utilizar native query?.

    Abraços

    • Olá João, boa tarde.

      1-Basta seguir os passos da página 17 que mostra o que deve ser feito com relação ao banco de dados
      2-O SpringData dá suporte à queries nativas assim como o JPA. Aqui no blog não tenho exemplo, mas na internet você acha diversos exemplos.

      Obrigado pela visita e pelo apoio.

  56. Bom dia Hebert,

    Excelente tutorial, somente umas sugestões que poderá melhorar o tutorial.
    A utilização da uma BD “in memory”, para efeitos de aprendizagem, será mais simples pois como estas a utilizar hibernate e Spring-Data, não te terás que te preocupar com a instalação de um postgress como acontece actualmente.
    Assim no teu codigo poderas alterar no POM a dependencia:

    para:

    Assim terás já a tua dependencia do HSQL no projecto.

    No passo seguinte teras que alterar a persistence.xml
    de
    para:

    e finalmente teras que alterar o context.xml para que a DataSource seja correctamente carregada.

    De qualquer forma, esta um tutorial 5*.

    Obrigado.
    —————————————————————
    Tomei a liberdade de fazer um fork do seu projecto com suporte para hsql.

    github.com/alvesp/ContactsSpringMVCAngular

    Obrigado

    • Paulo, boa tarde.

      Eu já utilizei banco em memória em outros posts, mas os leitores sempre me perguntavam sobre como criar o projeto para um banco físico. Por isso que eu atualmente crio para um banco físico ao invés de memória, para facilitar para a maioria que pergunta sobre um banco físico.

      Infelizmente o código aqui fica todo quebrado, e acabou que não apareceu em sua pergunta.

      Até mais.

  57. Como vai Herbert, tudo bem contigo? :-)
    Deixa te perguntar um trem, tem como voce dar um exemplo de como implementar essa mesma aplicação só que utilizando JSF?

    Estou tentando converter a sua aplicação para JSF + Primefaces, mas para quem não tem conhecimento total de todas as tecnologias fica quase impossivel.

    Estou preso em duas questões:

    Primeira: Depois que recebo o pedido do Cliente no ManagedBean eu posso utlizar da mesma forma as outras chamadas (service,DAO,etc)?

    Segunda: Estou acostumado a utilizar GENERIC, ficou confuso para mim o GENERIC do Spring-Data, sinceramente eu não consigo entender (Sorry :-( ).

    Se voce puder me dar um norte ficaria eternamente grato amigo. :-)

    Abraços

    Jomello

    • João, boa noite.

      Primeiro, me perde a demora em responder. Estou muito pegado no trabalho, para você ter idéia, estou te respondendo dele enquanto um deploy não termina.

      Infelizmente não tenho como criar esse exemplo agora. =/

      Você poderá usar da mesma forma se você integrar o JSF com o Spring. Existem diversos tutoriais na internet que mostra como fazer isso.

      Imagine que o SpringData é o cara que faz o papel do DaoGenérico. Só que nele você ñ precisa implementar as classes, basta fazer a interface que o Spring implementa para você.

      Desculpe ñ ser muito último e a demora em responder.

      Att

  58. Primeiramente parabéns pelo post muito bom, parabéns mais uma vez.

    Na classe UserSession quando é colocada a anotação @Autowired aparece este erro quando é colocado a aplicação para rodar no servidor:

    17:35:41,205 ERROR [org.springframework.web.context.ContextLoader] (MSC service thread 1-4) Context initialization failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘userService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.econtabil.repository.UserRepository com.econtabil.service.UserService.userRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘userRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.econtabil.model.User

    Obrigado.

    • Giancarlo, boa noite.

      Primeiro, me perde a demora em responder. Estou muito pegado no trabalho, para você ter idéia, estou te respondendo dele enquanto um deploy não termina.

      Me desculpe mas não sei te ajudar. Não existe a classe UserSession no uaiContacts, eu não sei falar qual o tipo de alteração que você fez para provocar esse erro. A mensagem diz que: “Not an managed type: class com.econtabil.model.User”. Verifique se você declarou User como Entity.

      Obrigado pela visita.

  59. Caríssimo Hebert,

    Assim como “Fernando Werneck”e os outros, gostaria de agradecer ao excelente tutorial! Hoje em dia são poucos os que escrevem de maneira tão didática e com tanta qualidade e ainda disponibilizam o codigo completo para download. Já vi varios exemplos bestas, mas esse aqui é bem completo, aborda vários frameworks e é bem atual e pratico. Realmente show de bola!

    Eu troquei o Banco para H2 uma vez que estou apenas testando mas não estou conseguindo logar no sistema e nem consigo debugar para saber a query que ele esta executando, diante do problema, como poderia:

    1 – Debugar os metodos do DAO uma vez que só tenho interfaces? Imagino que não possa e para isso deveria ser exibido os logs com as queryes realizadas pelo log4j.

    2 – criei e setei as seguintes informações no banco H2.

    insert into SYSTEM_USER (id, name , email , password , enabled , user_role) values(1, ‘kuroki’, ‘te@te.com’, ‘kuroki’, ‘S’, ‘ROLE_ADMIN’);
    insert into SYSTEM_USER (id, name , email , password , enabled , user_role) values(2, ‘kuroki 2′, ‘ta@te.com’, ‘kuroki’, ‘S’, ‘ROLE_USER’);

    3 – NO arquivo “spring-security.xml”, para que servem as tags “users-by-username-query” e “authorities-by-username-query” ? Onde eu configuro a query de login? Digamos que meu login seria por codigo, senha e setor de atuacao, ou seja, deve haver algum lugar onde eu especifique a query que vou usar assim como os seus campos.

    4 – Como é que o Spring mapeia o campo “j_username” do JSP para o campo “name ou email” ou seja la qual for o campo?

    5 – No arquivo “context.xml” os dados de usuario e senha são referentes ao usuarios do BANCO e nao da aplicação, confere?

    6 – Habilitando o Log para DEBUG, percebi esse erro:

    DEBUG [org.springframework.security.authentication.ProviderManager] [] http-bio-8080-exec-6 Authentication attempt using org.springframework.security.authentication.dao.DaoAuthenticationProvider
    DEBUG [org.springframework.jdbc.core.JdbcTemplate] [] http-bio-8080-exec-6 Executing prepared SQL query
    DEBUG [org.springframework.jdbc.core.JdbcTemplate] [] http-bio-8080-exec-6 Executing prepared SQL statement [select email, password, enabled from usuario where email = ?]
    DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] [] http-bio-8080-exec-6 Fetching JDBC Connection from DataSource
    DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] [] http-bio-8080-exec-6 Returning JDBC Connection to DataSource
    DEBUG [org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator] [] http-bio-8080-exec-6 Translating SQLException with SQL state ‘22018’, error code ‘22018’, message [Data conversion error converting “S” [22018-182]]; SQL was [select email, password, enabled from usuario where email = ?] for task [PreparedStatementCallback]
    TRACE [org.springframework.web.context.support.XmlWebApplicationContext] [] http-bio-8080-exec-6 Publishing event in Root WebApplicationContext: org.springframework.security.authentication.event.AuthenticationFailureServiceExceptionEvent; Authenticated: false; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@fffdaa08: RemoteIpAddress: 127.0.0.1; SessionId: 32DD1CBECE87F0942BDF873DE92A8752; Not granted any authorities]
    DEBUG [org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter] [] http-bio-8080-exec-6 Authentication request failed: org.springframework.security.authentication.AuthenticationServiceException: PreparedStatementCallback; SQL [select email, password, enabled from usuario where email = ?]; Data conversion error converting “S” [22018-182]; nested exception is org.h2.jdbc.JdbcSQLException: Data conversion error converting “S” [22018-182]

    são mutias duvidas, algumas simples mas a ideia é deixar o mais claro possível para os outros leitores.

    Obrigado pela atenção!

    • Antonio, boa noite.

      Primeiro, me perde a demora em responder. Estou muito pegado no trabalho, para você ter idéia, estou te respondendo dele enquanto um deploy não termina.

      Vamos lá:
      1) Você não precisa debugar o DAO pois a implementação será provida pelo Spring, é um Proxy que ele cria em tempo de execução. Você consegue melhorar o log se você colocar o Hibernate também em modo de DEBUG. Você pode alterar isso tanto no persistence.xml na configuração hibernate.show_sql = true e também declarando a entrada dele no log4j.xml como DEBUG

      3) A primeira consulta procura saber se o usuário existe e se ele está habilitado para logar. A segunda consulta verifica se ele tem permissão para acessar o que ele está tentando acessar.

      4) Se não me engano ele faz isso pela posição na query. Note que a query que busca pelo usuário aceita apenas um parâmetro, com isso ele pega o username e joga lá.

      5) Confere. (:

      6) Honestamente a única coisa que eu vi foi que o login falhou, e nada mais.

      Obrigado pelo apoio e pela visita.

  60. Parabéns Hebert pelo excelente post. Estou sempre lendo o blog, realmente muito didático, ainda mais para mim que estou migrando do .net para o java.

    Estou fazendo o projeto aqui na minha máquina, mas está dando o erro abaixo no arquivo spring-jpa.xml:

    Referenced file contains errors (http://www.springframework.org/schema/beans/spring-beans-3.0.xsd). For more information, right click on the message in the Problems View and select “Show Details…”

    Ao clicar em Show Details aparece as seguintes mensagens:
    sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of ‘http://www.springframework.org/schema/beans,identifiedType

    O que pode estar acontecendo?

    • Willian, boa noite.

      Primeiro, me perde a demora em responder. Estou muito pegado no trabalho, para você ter idéia, estou te respondendo dele enquanto um deploy não termina.

      Honestamente não sei te falar, isso me parece mais problema de validação do XML.

      Esse erro te atrapalha em algo na hora de rodar o projeto?

  61. Boa tarde,
    não consigo fazer o projeto (.war) rodar direto no tomcat. Ele funciona 100% se iniciado pelo maven. Primeiro tive que colocar alguns “.jar” do log4j na pasta lib do tomcat e agora está dando erro no spring-jpa.xml:
    Error creating bean with name ‘org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0′: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in ServletContext resource [/WEB-INF/spring/spring-jpa.xml]: Invocation of init method failed; nested exception is org.springframework.jndi.JndiLookupFailureException: JndiObjectTargetSource failed to obtain new target object; nested exception is javax.naming.NameNotFoundException: Name [jdbc/tomcatDataSource] is not bound in this Context. Unable to find [jdbc].

    Tem mais alguma configuração para fazer ?

    • Eduardo, boa tarde.

      Você deve colocar todas as dependências que estão descritas no plugin do tomcat dentro do pom.xml.

      Encontre a tag tomcat no pom e adicione todas as bibliotecas descritas na parte de “dependecies”. Outra coisa é editar o arquivo context.xml do tomcat adicionando a tag do datasource que tem no exemplo do post.

      Obrigado pela visita.

  62. Bom dia Hebert, blza?

    Estou fazendo uma aplicação parecida, porém meu front-end fica em um servidor e o Java em outro.
    Como vc indicaria para eu fazer essa questão do login e também toda a segurança da aplicação tendo em vista que a aplicação estão em servidores diferentes.

    • Lázaro, boa tarde.

      Me desculpe pela demora em responder, estou muito pegado no trabalho ultimamente… estou até mesmo respondendo dele.

      Você pode usar o Token como autenticação. O servidor vai gerar um token (algo como ALKJSDLKJASD82917238ASDKLJ) e vai manter ativo enquanto for necessário. O próprio SpringSecurity já tem esse controle.

      Obrigado pela visita e pela confiança.

  63. Boa noite Hebert, tudo bom?
    Primeiramente parabens pelo belo trabalho … aprendi JSF com seu blog e agora estou começando a me aventurar no Spring MVC.
    Segui seu tutorial mas montando uma app teste aqui.
    Ao subir o tomcat ocorre o seguinte erro java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory.
    Porém no meu pom o jar esta ok

    log4j
    log4j
    1.2.16

    org.slf4j
    slf4j-api
    1.7.1

    org.slf4j
    slf4j-log4j12
    1.7.1

    Estou utilizando jdk 8.
    Ja dei uma googada mas nd do que encontrei me ajudou.
    Sabe o que posso estar fazendo de errado?

    Obrigado e continue com esse excelente trabalho.

    []’s

  64. Olá, primeiro gostaria de agradecer pelo excelente tutorial. Se puder me responder, gostaria de saber como atualizar para o Spring-data 1.7 pois a versão desse tutorial é a 1.2 e está muito desatualizada inviabilizando muito dos benefícios do spring-data.

    Att Thiago

    • Thiago, boa tarde.

      Tente mudar a versão no pom.

      Eu nunca tive problema em migrar os projetos do Spring, então pode ser que funcione.

      Depois conte o resultado.

      Até mais, e obrigado pela visita.

  65. Bom dia Hebert.

    Seus posts são sempre muito bons, são bem didáticos. Aprendo muito com eles.
    Eu estou começando com rest, desenvolvi de acordo com o post e até agora obtive sucesso, porém me surgiu uma dúvida, talvez você possa me ajudar. Eu andei procurando a respeito das diferenças, vantagens e desvantagens em desenvolver uma aplicação web com rest usando spring mvc ou apenas o suporte rest da especificação. Não achei nada, acredito que desenvolvendo uma aplicação das duas formas acabe por me dar uma noção, mas gostaria de saber se você possui alguma opinião sobre isso. Desde já agradeço.

    • Henrique, boa tarde.

      Me desculpe a demora, estive muito ocupado nesse último mês.

      A vantagem do SpringMVC é que você poderá usar sua injeção automática de recursos. O Spring é um mundo de frameworks muito úteis. Quando você usa alguma implementação REST você terá que utilizar de algum outro modo para injetar seus recursos: CDI ou EJB.

      Espero ter ajudado.

      Obrigado por tudo e desculpe a demora.

      Att,

  66. Boa noite,

    Excelente explicação, parabéns pela dedicação.

    Tentei importar o projeto no eclipse e ele abre com erros nos arquivos spring-jpa.xml e no angular.min.js
    não deixando rodar a aplicação será que o problema é com a a minha configuração?

    • Luciana, boa tarde.

      Me desculpe a demora, estive muito ocupado nesse último mês.

      Esses erros não devem parar o início da aplicação. Qual o erro que aparece?

      Obrigado por tudo e desculpe a demora.

  67. Olá Hebert primeiramente quero lhe agradecer pelos excelentes posts que você cria, me ajuda muito no meu aprendizado.

    vamos ao problema…

    não está localizando o lookup no context, é necessário ter o datasource no Tomcat tb?

    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0′: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in ServletContext resource [/WEB-INF/spring/spring-jpa.xml]: Invocation of init method failed; nested exception is org.springframework.jndi.JndiLookupFailureException: JndiObjectTargetSource failed to obtain new target object; nested exception is javax.naming.NameNotFoundException: Name [jdbc/tomcatDataSource] is not bound in this Context. Unable to find [jdbc].
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:449)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4994)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5492)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in ServletContext resource [/WEB-INF/spring/spring-jpa.xml]: Invocation of init method failed; nested exception is org.springframework.jndi.JndiLookupFailureException: JndiObjectTargetSource failed to obtain new target object; nested exception is javax.naming.NameNotFoundException: Name [jdbc/tomcatDataSource] is not bound in this Context. Unable to find [jdbc].
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:400)
    at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:275)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:139)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.(PersistenceExceptionTranslationInterceptor.java:79)
    at org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor.(PersistenceExceptionTranslationAdvisor.java:70)
    at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java:103)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1475)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1443)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    … 19 more
    Caused by: org.springframework.jndi.JndiLookupFailureException: JndiObjectTargetSource failed to obtain new target object; nested exception is javax.naming.NameNotFoundException: Name [jdbc/tomcatDataSource] is not bound in this Context. Unable to find [jdbc].
    at org.springframework.jndi.JndiObjectTargetSource.getTarget(JndiObjectTargetSource.java:139)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:182)
    at com.sun.proxy.$Proxy8.getConnection(Unknown Source)
    at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:70)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcServicesImpl.java:242)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:117)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1818)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1776)
    at org.hibernate.ejb.EntityManagerFactoryImpl.(EntityManagerFactoryImpl.java:96)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:899)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:76)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:268)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
    … 34 more
    Caused by: javax.naming.NameNotFoundException: Name [jdbc/tomcatDataSource] is not bound in this Context. Unable to find [jdbc].
    at org.apache.naming.NamingContext.lookup(NamingContext.java:819)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:167)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:156)
    at javax.naming.InitialContext.lookup(Unknown Source)
    at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:154)
    at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178)
    at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:104)
    at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105)
    at org.springframework.jndi.JndiObjectTargetSource.getTarget(JndiObjectTargetSource.java:132)
    … 52 more

    • Tiago, boa tarde.

      Verifique se os dados da conexão com o banco de dados estão corretos, valide também se o arquivo context.xml está no local correto.

      Obrigado pela visita.

  68. Parabéns pelo post realmente muito bom!

    o spring facilita bastante o processo de escrever as camadas da aplicação com suas classes prontas, é só implementar e ser feliz!

    Muito bom, estou adorando a combinação Bootstrap + Angular + java + hibernate + spring MVC

    • Tardelli, boa tarde.

      Também gostei muito dessa combinação. Facilita muito.

      Estou agora estudando mais sobre o angular para fazer um outro post, contendo mais informação sobre o Angular.

      Obrigado pela visita.

  69. É que eu estou tentando hospedar essa aplicação e eu não descobri o que eu tenho que mudar no código para dar certo. Se alguém tiver uma dica, fico agradecido.

  70. E ai uaihebert,

    Voltando aqui no post algum tempo depois rsrsrsrs, novos projetos com Angular.js rolando, só se fala nesse cara agora mano kkkkk, esqueceram o bom e velho JSF…

    E ai quando vai fazer aquele novo passo-a-passo abordando mais profundamente o Angular? com Spring Boot ,Spring Initializr website, Node.js e tudo mais? rsrsrsrs, abraços…

Leave a Comment