#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
и в совете добавьте новый метод для обработки этих типов исключений.
Это должно решить вашу проблему!