일부 유효성 검사가있는 간단한 스프링 레스트 컨트롤러가 있습니다. 내 이해는 유효성 검사 실패는 MethodArgumentNotValidException을 던질 것입니다. 그러나 내 코드 대신 BindException이 throw됩니다. 디버그 메시지에서, 나는 또한 응용 프로그램이 null ModelAndView를 반환하는 것을 보았습니다.REST 응용 프로그램에서 MethodArgumentNotValidException 대신 BindException이 발생했습니다.
나머지 컨트롤러가 BindException을 던지거나 null ModelAndView를 반환하는 이유는 무엇입니까?
참고 : 나는 컬을 사용하여 내 웹 응용 프로그램을 테스트하고 내가 의도적으로 @NotNull 및 @NotBlank 주석으로 표시 필수 항목 인 "이름"매개 변수를 생략하고는 HTTP POST
curl -X POST http://localhost:8080/tasks
을하고있다.
내 컨트롤러 :
@RestController
public class TasksController {
private static Logger logger = Logger.getLogger(TasksController.class);
@Autowired
private MessageSource messageSource;
@Autowired
private Validator validator;
@InitBinder
protected void initBinder(WebDataBinder binder){
binder.setValidator(this.validator);
}
@RequestMapping(value = "/tasks", method = RequestMethod.POST)
public Task createTask(@Valid TasksCommand tasksCommand){
Task task = new Task();
task.setName(tasksCommand.getName());
task.setDue(tasksCommand.getDue());
task.setCategory(tasksCommand.getCategory());
return task;
}
}
내 "명령"클래스 (즉 검증 주석을 포함)
public class TasksCommand {
@NotBlank
@NotNull
private String name;
private Calendar due;
private String category;
... getters & setters ommitted ...
}
내 RestErrorHandler 클래스 :
@ControllerAdvice
public class RestErrorHandler {
private static Logger logger = Logger.getLogger(RestErrorHandler.class);
@Autowired
private MessageSource messageSource;
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorsList processErrors(MethodArgumentNotValidException ex){
logger.info("error handler invoked ...");
BindingResult result = ex.getBindingResult();
List<FieldError> fieldErrorList = result.getFieldErrors();
ErrorsList errorsList = new ErrorsList();
for(FieldError fieldError: fieldErrorList){
Locale currentLocale = LocaleContextHolder.getLocale();
String errorMessage = messageSource.getMessage(fieldError, currentLocale);
logger.info("adding error message - " + errorMessage + " - to errorsList");
errorsList.addFieldError(fieldError.getField(), errorMessage);
}
return errorsList;
}
}
processErrors 방법은 @ExceptionHandler 표시 (...) 주석은 절대 호출되지 않습니다. @ExceptionHandler (...) 주석을 사용하여 BindException을 catch하려고하면 핸들러 메소드가 호출됩니다.
필자는 필요한 경우 Task, TaskCommand, Error 및 ErrorsList와 같은 몇 가지 지원 클래스를 게시 할 수 있습니다.
나는'@ RestController'에서 똑같은 문제를 겪고 있습니다. '@Controller'를'@ RequestBody'와'@ResponseBody'와 결합하면 작동합니다. 혹시 이걸 해결 했니? – Dormouse
방금 대답했습니다. 아래를 봐주세요. 귀하의 문제가 다른 것 일지라도. 어느 쪽이든 작동해야합니다. – Jigish