Я новичок в весенней загрузке и добавляю пользовательские исключения в свой контроллер через controllerAdvisor. В MyController.class я выполняю три операции:
- Получить все билеты, имеющиеся в базе данных.
- Получить билет по идентификатору
- Создать билет.
Нижеупомянутый класс - 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.
Пожалуйста, сообщите об этом.