Как я могу удалить код состояния 201 и сохранить код состояния 200 вместе с другими кодами состояния?

#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.