#spring #spring-boot #spring-mvc
Вопрос:
Для метода PUT в контроллере spring, если я хочу показать код состояния 200 вместе с другими кодами состояния, такими как 401,404, и удалить код состояния 201 .
Я попытался использовать @ResponseStatus(HttpStatus.ХОРОШО), но это не работает для меня.
@PutMapping("/entry/user").
@ResponseStatus(HttpStatus.OK).
public UpdatingVO userEntry(
UpdatingVO update = new UpdatingVO();
try{.
update=service.allowUser(updateDtsVO);
}
catch(Exception e){.
update.setErrorMessage(e.getMessage());
update.setStatus(UserConstant.FAILURE).
}
return update;
Комментарии:
1. Этот вопрос нуждается в большем контексте. Что вы пробовали до сих пор? Пожалуйста, предоставьте более подробную информацию, чтобы мы могли понять достаточно, чтобы помочь вам.
2. Я добавил то, что пробовал до сих пор . Я попытался использовать @ResponseStatus(HttpStatus. Хорошо), но это не сработало.
Ответ №1:
Если я понимаю, вы можете определить в том же контроллере статус возврата в случае определенного исключения и использовать ResponseEntity для возврата 2xx. Возьмем этот пример:
@PutMapping("/{id}")
public ResponseEntity<?> updateOrCreate(@PathVariable("id") Long id, @RequestBody Entity entity) {
boolean created = dao.updateOrCreate(entity);
if (created) return ResponseEntity.created(URI.create("entities/" id)).build();
return ResponseEntity.ok().build();
}
@GetMapping("/{id}")
public ResponseEntity<?> get(@PathVariable("id") Long id)
Entity entity = dao.findById(id).orElseThrow(() -> new NotFoundException());
return ResponseEntity.ok(entity);
}
@ResponseStatus(HttpStatus.NOT_FOUND)
static class NotFoundException extends RuntimeException {
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
static class BadRequestException extends RuntimeException {
}
Пользовательское исключение:
class UpdatingException extends RuntimeException {
private UpdatingVO update;
public UpdatingException(UpdatingVO up) {
this.update = up;
}
public UpdatingVO getUpdatingVO() {..}
}
Обработчик:
@ExceptionHandler(UpdatingException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public UpdatingVO handleUpdating(UpdatingException ex) {
return ex.getUpdatingVO();
}
В случае использования обработчика вам нужно ввести ex в метод userEntry, например throw new UpdatingException(update);
Комментарии:
1. Есть ли какой-либо другой способ, кроме использования ResponseEntity? Я добавил то, что я пробовал до сих пор.
2. Я попытался использовать ResponseEntity, но он не удаляет код состояния 201
3. Вы можете создавать свои собственные исключения и обрабатывать их в своем контроллере. Я обновил свой пример.
4. @PutMapping(«/запись/пользователь»). @ResponseStatus(HttpStatus.OK). общедоступный ответ<UpdatingVO> Вход пользователя( UpdatingVO update = новое обновление(); попробуйте{. обновление=услуга. Разрешить пользователю(updateDtsVO); } поймать(исключение e){. update.setErrorMessage(e.GetMessage()); update.setStatus(ПольЗователь постоянен. НЕУДАЧА). } верните ResponseEntity.ok().тело(обновление);
5. Я получаю 200 статусных ответов для этого метода. Но я также получаю код состояния 201 в ответах в swagger .Создание обработчика исключений просто даст мне необходимый код состояния, но не удалит код 201 в разделе ответов swagger.