Переход к корневой причине проверки

#java #spring #spring-boot

#java #весна #spring-boot

Вопрос:

У меня есть RestController , который проверяет его ввод:

 class Item {}
class ItemHolder {
  Item item;
}

@RestController
public class ItemRestController {
    @GetMapping
    public String get(@Valid ItemHolder itemHolder) { }
}
 

У меня есть преобразователь параметров, который выдает пользовательское исключение с важным сообщением:

 class CannotConvertException extends RuntimeException {}

class ItemConverter implements Converter<String, Item> {
  @Override
  public Item convert(String value) {
    throw new CannotConvertException("Important failure message: "   value);
  }
}
 

У меня также есть обработчик исключений:

 @ControllerAdvice
class ResponseExceptionHandler extends ResponseEntityExceptionHandler {
  @Override
  protected ResponseEntity<Object> handleBindException(
            BindException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {

        // How to get only the message from CannotConvertException here?
    }
 

Внутри handleBindException сообщение (т.е. ex.getMessage() ) Я получаю что-то вроде:

org.springframework.validation.BeanPropertyBindingResult: 1 ошибка поля ошибок в объекте ‘itemHolder’ в поле ‘item’: отклоненное значение [очень плохое значение]; коды [typeMismatch.itemHolder.item,typeMismatch.item,typeMismatch.com.example.Элемент, совпадение типов]; аргументы [org.springframework.context.support.DefaultMessageSourceResolvable: коды [itemHolder.item,item]; аргументы []; сообщение по умолчанию [item]]; сообщение по умолчанию [Не удалось преобразовать значение типа ‘java.lang.Строка[]’ к требуемому типу’com.example.Item’; вложенным исключением является org.springframework.core.convert.ConversionFailedException: не удалось преобразовать из типа [java.lang.Строка] для ввода [com.example.Item] для значения «очень плохое значение»; вложенным исключением является com.example.CannotConvertException: важное сообщение об ошибке: очень плохое значение]

Не прибегая к хакерским методам, таким как синтаксический анализ строки или отражение, как бы я мог убедиться, что обработчик исключений может получить Important failure message: very bad value доступ только к части, без всякого шума перед этим?

Я в порядке, меняя конвертер, если это лучшая альтернатива.

Ответ №1:

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

Это должно решить вашу проблему!