Как избавиться от исключения по умолчанию для весенней загрузки? - PullRequest
0 голосов
/ 13 июля 2020

Я новичок в весенней загрузке и добавляю пользовательские исключения в свой контроллер через controllerAdvisor. В MyController.class я выполняю три операции:

  1. Получить все билеты, имеющиеся в базе данных.
  2. Получить билет по идентификатору
  3. Создать билет.

Нижеупомянутый класс - MyController.class.

@RestController
public class MyController {
    @Autowired
    private TicketServiceImpl ticketService;

    @GetMapping(/ticket)
    public ResponseEntity<?> getAllTickets() {

        List<Ticket> list=(List<Ticket>)ticketService.findAll();
        return new ResponseEntity<>(list, HttpStatus.OK);
    }

    @GetMapping(Constant.BASE_URL+"/{id}")
    public ResponseEntity<Ticket> getTicketById(@PathVariable("id") long id) {
        Optional<Ticket> ticketData = Optional.ofNullable(ticketService.get(id));

         if(!ticketData.isPresent()){
             throw new RecordNotFoundException("id-" + id);
         }
           return new ResponseEntity<>(ticketData.get(), HttpStatus.OK);
       
    }

    @PostMapping(/ticket)
    public ResponseEntity<Ticket> createTicket(@RequestBody Ticket ticket) {
          
            ticketService.save(ticket);
            return new ResponseEntity<>(ticket, HttpStatus.CREATED);
     }

}

Под классом находится мой собственный класс дескриптора исключения, в котором я обрабатываю свои пользовательские исключения.

@SuppressWarnings({"unchecked","rawtypes"})
@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(Exception.class)
    public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
        List<String> details = new ArrayList<>();
        details.add(ex.getLocalizedMessage());
        ErrorResponse error = new ErrorResponse("Server Error", details);
        return new ResponseEntity(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(RecordNotFoundException.class)
    public final ResponseEntity<Object> handleUserNotFoundException(RecordNotFoundException ex, WebRequest request) {
        List<String> details = new ArrayList<>();
        details.add(ex.getLocalizedMessage());
        ErrorResponse error = new ErrorResponse("Record Not Found", details);
        return new ResponseEntity(error, HttpStatus.NOT_FOUND);
    }

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        List<String> details = new ArrayList<>();
        for(ObjectError error : ex.getBindingResult().getAllErrors()) {
            details.add(error.getDefaultMessage());
        }
        ErrorResponse error = new ErrorResponse("Validation Failed", details);
        return new ResponseEntity(error, HttpStatus.BAD_REQUEST);
    }

}

ниже указан класс c для не найденных исключений.

@ResponseStatus(HttpStatus.NOT_FOUND)
public class RecordNotFoundException extends RuntimeException {
    public RecordNotFoundException(String exception) {
        super(exception);
    }
}

В application.properties я добавляю эти три условия

server.error.whitelabel.enabled=false
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false

Когда я попадаю на свой сервер с помощью GET API http://localhost: 8080 / ticke. Он должен выдавать исключение неверного запроса, но выдает исключение Not found «404», и когда я нажимаю GET API http://localhost: 8080 / ticket / 24, мой идентификатор не создается. Следовательно, он должен возвращать исключение ресурс не найден, но при этом возвращается внутренняя ошибка сервера 500.

Пожалуйста, сообщите об этом.

1 Ответ

1 голос
/ 13 июля 2020

Вы получаете ошибку, потому что Spring не смог найти конечную точку, которую вы ищете. Таким образом, он не применяет к нему никаких советов контроллера, поскольку он не нашел контроллер, который соответствует запрошенному URL-адресу.

Вот небольшая статья , объясняющая это более подробно.

...