6 erros com Spring Boot que você não deve fazer

แชร์
ฝัง
  • เผยแพร่เมื่อ 10 ก.ย. 2024
  • O vídeo apresenta algumas más práticas de desenvolvimento em projetos Spring Boot:
    1 - Devolver entidades JPA ao invés de DTOs
    2 - Não utilizar princípios de responsabilidade única
    3 - Não utilizar exception Handlers
    4 - Não utilizar beans validations
    5 - Não usar Dependency Injection
    6 - Não utilizar Consultas Páginadas com JPA
    Acompanhe cada um desses problemas bem com o suas soluções
    Mais conteúdos de Spring Boot nessa Playlist:
    • Java e Spring Boot

ความคิดเห็น • 51

  • @MasterDevTV
    @MasterDevTV  ปีที่แล้ว +5

    Para acessar o código desse exemplo acesse o link abaixo:
    github.com/thiagolenz/erros-com-spring-boot-6-erros

  • @gustavorodrigues8070
    @gustavorodrigues8070 2 หลายเดือนก่อน +1

    Cara, esse video é ouro!

  • @joaovitor12full
    @joaovitor12full หลายเดือนก่อน +1

    vídeo maravilhoso, obrigado
    já fiz umas 2 coisas ai que vc disse pra não fazer

  • @cristianoseixas2417
    @cristianoseixas2417 3 หลายเดือนก่อน +1

    Spring boot é um framework espetacular, dá até gosto de trabalhar com ele.

  • @cesin9
    @cesin9 5 หลายเดือนก่อน +2

    Top , aqui em Engenheiro Schimitt e curtindo essa aula TOP 👍😎, muito bem explicado, vlw

    • @cesin9
      @cesin9 5 หลายเดือนก่อน +2

      Tem o carregamento lazzy e eager que o pessoal também não trata

    • @MasterDevTV
      @MasterDevTV  5 หลายเดือนก่อน +1

      Obrigado por acompanhar meus vídeos !!

  • @johnyguido
    @johnyguido ปีที่แล้ว +3

    Excelente conteúdo! Continue enviando videos diretos e simples assim. Parabéns!

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว +1

      Obrigado pela audiência Johny, em breve novos conteúdos aqui no canal!!!

  • @gabbop
    @gabbop ปีที่แล้ว +2

    parece que você fez o vídeo pra mim kkkk todos os 6 erros são dúvidas que eu tinha/tenho. Agora consigo mexer no meu projeto sabendo o que devo fazer kk valeu!! Me inscrevi aqui

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว +1

      Obrigado pelo feedback! realmente esses problemas acontecem bastante.

  • @lemuk9233
    @lemuk9233 ปีที่แล้ว +2

    master, o teu conteúdo é ouro. Muito obrigado estão me ajudando muito.

  • @AndersonLenz
    @AndersonLenz ปีที่แล้ว +2

    É são conceitos básicos, mas para quem não está se atualizando, acaba cometendo. Ótimo vídeo.

  • @SamGoularte
    @SamGoularte 6 หลายเดือนก่อน +2

    Cirúrgico!

  • @luisaaraujo9565
    @luisaaraujo9565 ปีที่แล้ว +2

    Conteúdo incrível ❤

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว

      Em breve mais conteúdos , vai ter vídeo sobre Kafka!!!

  • @pclps2679
    @pclps2679 ปีที่แล้ว +2

    obrigado professor, estou começando agora, já estava fazendo errado rs

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว +1

      Acontece hehehe, errar é normal, independente do nível que estamos.

  • @lucassouzati
    @lucassouzati ปีที่แล้ว +1

    Conteúdo de altissima qualidade. Muito obrigado por compartilhar.

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว +1

      Eu que agradeço por acompanhar o canal aqui no YT!!

  • @fetao1928
    @fetao1928 ปีที่แล้ว +1

    Fui o inscrito 1000

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว

      Muito bom!!! Que seja o primeiro de muitos!!! Obrigado pela audência!!

  • @adrianodantas3074
    @adrianodantas3074 2 หลายเดือนก่อน +1

    Muito bom! Parabéns 👏🏻👏🏻
    Então ficou uma questão aqui me martelando. Caso eu utilize a abordagem DDD, como o bean validation irá ajudar? Obrigado.

    • @MasterDevTV
      @MasterDevTV  2 หลายเดือนก่อน +1

      Pode colocar Beans Validation tanto nas Entity ou na API, eu prefiro colocar já na API.

  • @rubensleonardoheck4161
    @rubensleonardoheck4161 ปีที่แล้ว +1

    Sabe muito!!

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว

      Grande Rubens, valeu !!!

  • @ewertonlucas5128
    @ewertonlucas5128 ปีที่แล้ว +1

    Excelente conteúdo! ✌😁

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว +1

      Valeu pelo Feedback Ewerton :D

  • @gabrielalvesgoncalves9959
    @gabrielalvesgoncalves9959 ปีที่แล้ว +1

    Ótimas dicas!

  • @wldomiciano
    @wldomiciano ปีที่แล้ว +1

    Thiago, obrigado por este conteúdo! Tem 2 pontos que eu também considero não erros, mas práticas ruins e eu gostaria de saber sua opinião.
    O primeiro é definir o controller e seus métodos como públicos. Eu sempre acho que deixando-os públicos, vc está deixando aberto demais desnecessáriamente. Como nunca vamos nos referir a eles explicitamente no código, já que serão chamados automaticamente pelo Spring, eu sinto que eles deveria ficar como package-private. O mesmo vale para métodos anotados com @Bean.
    Pode ser que vc queria se referir ao controller nas suas classes de testes, mas como, normalmente, as classes de testes ficam no mesmo pacote que a classe testada, então não haveria problema com a visibilidade. Além disso, o mais comum é a gente testá-los indiretamente usando MockMvc de qualquer forma.
    E o segundo ponto é retornar um ResponseEntity nos controllers. Eu sempre acho que se vc não está fazendo mudanças como alterar cabeçalhos ou cookies, é melhor retornar o DTO direto. Acredito que assim vc diminui a complexidade do código e carga mental ao ler.
    O que vc acha?

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว +1

      Obrigado pela Audiência Wellington!! Vamos aos pontos do seu comentário:
      - Particularmente eu nunca vi implementações de @Controller funcionarem com métodos private, inclusive na própria documentação do spring, todos os exemplos são com métodos public. Encontrei uma boa resposta nesse link rules.sonarsource.com/java/RSPEC-3751/
      - Olhando nesse ponto de vista de arquitetura, essa questão de private/public deve se atentar mais para classes de domínio, e não nas classe de Ports (Entradas e saídas)
      - O teste usando MockMvc é mais focado em teste de contrato de API, trás mais abrangência.
      - A questão do ResponseEntity, eu também prefiro retornar o DTO, fica mais legível, mas é possível encontrar ResponseEntity nos projetos por aí
      Forte abraço!!

    • @wldomiciano
      @wldomiciano ปีที่แล้ว

      @@MasterDevTV Obrigado pela resposta!
      Sobre os métodos dos controllers, eu não me referia a métodos privados, mas sim a métodos "package-private".
      Package-private é o jeito que eu já vi por aí para se referirem à métodos, membros de classes, que não tem nenhum dos modificadores de acesso (public, protected e private) e, por isso, são visiveis apenas dentro do pacote em que foram declarados.
      Com isso, o que vc acha?

  • @lofizenbeats22
    @lofizenbeats22 ปีที่แล้ว +1

    🥰😍🤩

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว

      Obrigado por prestigiar o canal!!

  • @marcelodasilva4502
    @marcelodasilva4502 ปีที่แล้ว +1

    Entendi, mas fiquei com uma dúvida, usando caso o Bean validation não tenha uma validação para um dado é errado validar na unha? Podemos criar uma customização para validar, mas não entendi qual é o problema de validar na unha sendo que o Bean validation faz isso por baixo dos panos, poderia explicar por favor?

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว

      Fala Marcelo, beleza? o caso do Bean Validation é para utilizar em validações "simples demais" como @NotNull @NotEmpty, @Email @Positive para garantir que um valor é positivo. @Min @Max para trabalhar com intervalos válidos de valores númericos. Porém ele não atende a todos os cenários, e o excedente você pode fazer validações a mais com código sem problema. Agora validações simples automatizaveis você deve usar Beans Validations para diminuir complexidade de código sem precisar fazer uma série de IF ELSEs.

    • @marcelodasilva4502
      @marcelodasilva4502 ปีที่แล้ว +1

      Entendi a sua linha de raciocínio. Valeu

  • @Joaobraga-he3yo
    @Joaobraga-he3yo ปีที่แล้ว +1

    Na classe que fica a entidade, preciso ter um construtor vazio e um com todos os dados? Ou apenas no Dto colocar o construor vazio e os dados que quero disponibilizar

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว +2

      Na entidade é obrigado ter um construtor vazio por causa do JPA, o construtor com todos os campos é opcional. No DTO o mesmo cenário, precisa ter um construtor vazio por causa da API rest conseguir montar o objeto.

    • @Joaobraga-he3yo
      @Joaobraga-he3yo ปีที่แล้ว +2

      @@MasterDevTV você é fera ! Mais um inscrito.

  • @marcoslopesdasilva-ls1hj
    @marcoslopesdasilva-ls1hj ปีที่แล้ว +1

    Agora tem record java 17

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว

      Sim, quem já usa o java 17 pode usar o record.

  • @Lucas-iu8gd
    @Lucas-iu8gd ปีที่แล้ว

    Chamar uma camada de service somente com a prerrogativa de salvar dados no banco me parece um tanto quanto inutil. Voce está gerando mais complexidade desnecessária, camadas de "service", "interactors", "use-cases" deveriam ser para orquestrar regras de negócio das entidades, se o seu service está só chamando o repository pra fazer o crud e retornando uma resposta, poupe a si mesmo da burocracia e chame injete o repository no controller.

  • @mgmoura
    @mgmoura ปีที่แล้ว +1

    excelente video, obrigado !! simples e objetivo do comeco ao fim
    @validate seria como @valid ?

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว +1

      Bom questionamento, de acordo com a especificação @Validated é mais voltado para métodos e @valid para atributos.
      Tem uma explicação detalhada aqui> www.baeldung.com/spring-valid-vs-validated

  • @jamilsouza
    @jamilsouza ปีที่แล้ว +1

    Por que utilizar `@Autowired` invés de ` final exampleRepository constructor(){this.exampleRepository = new exampleRepository() }`?

    • @MasterDevTV
      @MasterDevTV  ปีที่แล้ว +3

      Pois quando você instancia uma classe, também precisa se preocupar com as dependências internas e assim sucessivamente. Se você coloca @Autowired você determina que o Spring tem a responsabilidade de gerenciar essas criação de objetos para o seu código.

    • @SamGoularte
      @SamGoularte 6 หลายเดือนก่อน

      @@MasterDevTV seria um erro anotar como @Autowired o construtor?
      @Autowired
      construtor(aRespository, bRespository, cRespository) {
      this.aRespository = aRespository;
      this.bRespository = bRespository;
      this.cRespository = cRespository;
      }