2
respostas

[Dúvida] Erro ao acessar os endpoints da minha aplicação

Olá, estou começando os estudos com Spring Boot, mas estou tendo um problema com minhas entidades ao tentar acessar a url delas.

Aqui está o package explorer package explorer do projeto

A classe CommentController



@RestController
@RequestMapping("/comments")
public class CommentController {

    private final CommentService commentService;
    
    @Autowired
    public CommentController(CommentService commentService) {
        this.commentService = commentService;
    
    }
    
    @GetMapping("/{commentId}")
    public ResponseEntity<Comment> getCommentById(@PathVariable Long commentId) {
        
        Comment comment = commentService.getCommentById(commentId);
        return ResponseEntity.ok(comment);
        
    }
}

A classe CommentsService

package com.projetoredesocial.service;

@Service
public class CommentService {
    
    @Autowired
    private final CommentRepository commentRepository;
    
    public CommentService (CommentRepository commentRepository) {
        this.commentRepository = commentRepository;
    }
    public Comment createComment(Comment comment) {
        
        return commentRepository.save(comment);
    }
    
    public List<CommentDTO> getCommentDTOsByPostId(Long postId) {
        
        List<Comment> comments = commentRepository.findAllByPostId(postId);
        
        List<CommentDTO> commentDTOs = new ArrayList<>();
        
        for(Comment comment : comments) {
            CommentDTO commentDTO = mapCommentToDTO(comment);
            commentDTOs.add(commentDTO);
            
        }
        
        return commentDTOs;	
    }
    
    
    //
    public CommentDTO mapCommentToDTO(Comment comment) {
        CommentDTO commentDTO = new CommentDTO();
        commentDTO.setId(comment.getId());
        commentDTO.setText(comment.getText());
        commentDTO.setCommentDate(comment.getCommentDate());
        commentDTO.setUser(comment.getUser());
        commentDTO.setPost(comment.getPost());
        return commentDTO;
    }
    
    public void deleteComment(Long commentId, Long userId) {
        
        Comment comment = commentRepository.findById(commentId)
                .orElseThrow(() -> new CommentNotFoundException("Comentário não encontrado"));
        
        if(!comment.getUser().getId().equals(userId)) {
            throw new UnauthorizedAccessException("Você não tem permissão para excluir esse comentário");
        } 
        
        
            
        commentRepository.delete(comment);
        
    }
    public boolean hasComments(Post post) {
        List<Comment> comments = commentRepository.findByPost(post);
        return !comments.isEmpty();
    }
    public Comment getCommentById(Long commentId) {
        Optional<Comment> commentOptional = commentRepository.findById(commentId);
        
        if(commentOptional.isPresent()) {
            return commentOptional.get();
        } else {
            throw new CommentNotFoundException("Comentário não encontrado por ID");
        }
    }
    
}
2 respostas

Olá, Caio! Parece que você está fazendo um bom trabalho com o Spring Boot.

Pelo que pude analisar, seu código parece estar correto. No entanto, o erro pode estar ocorrendo por diversos motivos. Vou listar algumas possíveis causas:

  1. Verifique se o servidor está rodando corretamente. Às vezes, pode haver algum problema com o servidor que impede o acesso aos endpoints.

  2. Confira se a URL que você está tentando acessar está correta. O endpoint definido em seu CommentController é "/comments/{commentId}". Portanto, você deve acessar algo como http://localhost:8080/comments/1, substituindo 1 pelo ID do comentário que você deseja acessar.

  3. Certifique-se de que o comentário com o ID que você está tentando acessar realmente existe no banco de dados. Se você tentar acessar um comentário com um ID que não existe, o método getCommentById em seu CommentService lançará uma CommentNotFoundException.

  4. Verifique se há algum problema com o CommentRepository. Se houver algum problema com o CommentRepository, isso pode causar um erro ao tentar acessar os endpoints.

  5. Confira se o Spring Boot está conseguindo escanear suas classes. Às vezes, o Spring Boot pode não conseguir escanear suas classes se elas estiverem em um pacote diferente do pacote principal da aplicação. No package explorer que você compartilhou, não consegui ver a estrutura completa dos pacotes, então não posso confirmar se este é o problema. No entanto, você pode tentar mover suas classes para o mesmo pacote da classe principal da aplicação para ver se isso resolve o problema.

Espero que uma dessas sugestões possa ajudar a resolver o problema. Lembre-se, a depuração é uma parte importante do desenvolvimento de software. Não desanime se as coisas não funcionarem na primeira vez, é normal!

Espero ter ajudado e bons estudos!

Boa tarde, eu fiz um teste com uma classe

package com.projetoredesocial.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/")
public class HomeController {

    @GetMapping("/index")
    public String home() {
        return "index"; 
    }
}

esta classe funciona normalmente. Tentei usar o postman para acessar os outros endpoints, mas todos me retornam o mesmo erro:

Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.

Mon Sep 04 15:05:20 BRT 2023 There was an unexpected error (type=Not Found, status=404).

Eu criei o banco de dados, mas não criei as tabelas referentes ao banco de dados pois o tutorial que eu segui informava que não era necessário criar as tabelas, o spring faria isso por mim. Ainda não tenho nenhum comment criado, por isso, quando tento acessar o comments/1, dá o erro

Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.

Mon Sep 04 15:06:21 BRT 2023 There was an unexpected error (type=Internal Server Error, status=500).

O meu commentRepository é

package com.projetoredesocial.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;

import com.projetoredesocial.entity.Comment;
import com.projetoredesocial.entity.Post;
import com.projetoredesocial.entity.User;

public interface CommentRepository extends JpaRepository<Comment, Long>{

    List<Comment> findAllByPostId(Long postId);
    List<Post> findByUser(User user);
    List<Comment> findByPost(Post post);
}