2016-11-29 3 views
2

Я строю REST api весной, и у меня проблемы с обработкой исключений. Я хочу проверить полный запрос и предоставить информацию о полезной нагрузке за один раз.Отмена десериализации Spring Jackson и обработка исключений

Пусть мой объект

public class StubJson { 
    private BigDecimal bigDecimalField; 
    @NotEmpty 
    private String stringField; 

    public void setBigDecimalField(BigDecimal bigDecimalField) { this.bigDecimalField = bigDecimalField; } 
    public String setStringField(String stringField) { this.stringField = stringField; } 
} 

И мой контроллер

@RestController 
public class StubController { 
    @RequestMapping(value = "/stub", method = POST) 
    public void stub(@Valid @RequestBody StubJson stubJson) {} 
} 

Проверка этого объекта находится в @ControllerAdvice, который переводит FieldError объекты в переводных ошибки для конечного пользователя.

@ResponseStatus(BAD_REQUEST) 
@ResponseBody 
@ExceptionHandler(value = MethodArgumentNotValidException.class) 
public List<ErrorJson> processValidationError(MethodArgumentNotValidException ex) {} 

Если я прохожу в этом формате JSON

{"bigDecimalField": "text", "stringField": ""} 

Я хочу, чтобы ответ, как этот

[ 
    { 
    "field": "stringField", 
    "message": "Cannot be empty." 
    }, 
    { 
    "field": "bigDecimalField", 
    "message": "Not a number." 
    } 
] 

Если я делаю это я получаю

com.fasterxml. jackson.databind.exc.InvalidFormatException

на BigDecimalField, который содержит только информацию о только один раздел. Единственный вариант, который я вижу, это передать его в виде строки или написать специальные аннотации проверки. Есть ли более простой способ достичь этого?

+0

Ваше преобразование объекта не работает даже до того, как оно будет готово к проверке. Для достижения желаемого требуется, чтобы ваш объект был создан из вашего json-запроса успешно – ScanQR

ответ

0

Для этой цели вы можете использовать совет контроллера. Объявите рекомендации контроллера в своем приложении, поймайте ожидаемое исключение, преобразуйте требуемый ответ и возврат. Просто помните, что совет контроллера будет применен ко всем вашим контроллерам.

@ControllerAdvice 
public class ExceptionHandlerController { 

@ExceptionHandler(InvalidFormatException.class) 
    @ResponseBody public String typeMismatchException(HttpServletRequest request, HttpServletResponse servletResponse, InvalidFormatException e) { 

     String yourResponse = ""; 
     return yourResponse; 
    } 

} 
+0

В моей текущей реализации используется @ControllerAdvice, которое ловит MethodArgumentNotValidException, которое содержит ошибки проверки нескольких полей, в то время как это InvalidFormatException содержит только информацию об одном поле. Я уточню свой вопрос, чтобы сделать его более понятным. – jgeerts

Смежные вопросы