Jig*_*ish 9 java rest spring exceptionhandler
我有一个简单的Spring Rest Controller和一些验证.我的理解是验证失败会抛出MethodArgumentNotValidException.但是,我的代码抛出了BindException.在调试消息中,我还看到应用程序返回null ModelAndView.
为什么Rest Controller会抛出BindException或返回null ModelAndView?
注意:我正在使用curl测试我的Web应用程序并进行HTTP POST
curl -X POST http://localhost:8080/tasks
Run Code Online (Sandbox Code Playgroud)
我故意省略"name"参数,这是一个标有@NotNull和@NotBlank注释的必填字段.
我的控制器:
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的"命令"类(包含验证注释)
public class TasksCommand {
@NotBlank
@NotNull
private String name;
private Calendar due;
private String category;
... getters & setters ommitted ...
}
Run Code Online (Sandbox Code Playgroud)
我的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;
}
}
Run Code Online (Sandbox Code Playgroud)
用@ExceptionHandler(...)注释标记的processErrors方法永远不会被调用.如果我尝试使用@ExceptionHandler(...)注释捕获BindException,则会调用该处理程序方法.
我有几个支持类 - Task,TaskCommand,Error和ErrorsList - 我可以根据需要发布代码.
问题出在我的 curl 命令上。
curl -d 发送内容类型“application/x-www-form-urlencoded”。因此,Spring 将数据解释为 Web 表单数据(而不是 JSON)。Spring 使用 FormHttpMessageConverter 将 POST 主体转换为域对象并导致 BindException。
我们想要的是 Spring 将 POST 数据视为 JSON 并使用 MappingJackson2HttpMessageConverter 将 POST 主体解析为对象。这可以通过使用 curl 命令指定“Content-Type”标头来完成:
curl -X POST -H "Content-Type: application/json" -d '{"name":"name1", "due":"2014-DEC-31 01:00:00 PDT", "category":"demo"}' http://localhost:8080/tasks
Run Code Online (Sandbox Code Playgroud)
有关如何使用 curl 发布 JSON 数据的信息,请参阅此帖子:如何使用 Curl 从终端/命令行发布 JSON 数据 以测试 Spring REST?
此外,这里的约了MessageConverter有关Spring文档: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestbody HTTP://docs.spring .io/spring/docs/current/spring-framework-reference/html/remoting.html#rest-message-conversion
| 归档时间: |
|
| 查看次数: |
3338 次 |
| 最近记录: |