Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在REST应用程序中引发BindException而不是MethodArgumentNotValidException_Java_Spring_Rest_Exceptionhandler - Fatal编程技术网

Java 在REST应用程序中引发BindException而不是MethodArgumentNotValidException

Java 在REST应用程序中引发BindException而不是MethodArgumentNotValidException,java,spring,rest,exceptionhandler,Java,Spring,Rest,Exceptionhandler,我有一个简单的SpringREST控制器,带有一些验证。我的理解是验证失败会引发MethodArgumentNotValidException。但是,我的代码会抛出一个BindException。在调试消息中,我还看到应用程序返回null ModelAndView 为什么Rest控制器会抛出BindException或返回null ModelAndView 注意:我正在使用curl测试我的web应用程序,并制作一篇httppost curl -X POST http://localhost:80

我有一个简单的SpringREST控制器,带有一些验证。我的理解是验证失败会引发MethodArgumentNotValidException。但是,我的代码会抛出一个BindException。在调试消息中,我还看到应用程序返回null ModelAndView

为什么Rest控制器会抛出BindException或返回null ModelAndView

注意:我正在使用curl测试我的web应用程序,并制作一篇httppost

curl -X POST http://localhost:8080/tasks
我有意省略“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;
    }
}
我的“command”类(包含验证注释)

我的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;
    }
}
@ControllerAdvice
公共类RestErrorHandler{
私有静态记录器=Logger.getLogger(RestErrorHandler.class);
@自动连线
私有消息源;
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_请求)
@应答器
公共错误列表进程错误(MethodArgumentNotValidException ex){
info(“调用了错误处理程序…”);
BindingResult=ex.getBindingResult();
List fieldErrorList=result.getFieldErrors();
ErrorsList ErrorsList=新的ErrorsList();
用于(FieldError FieldError:fieldErrorList){
Locale currentLocale=LocaleContextHolder.getLocale();
String errorMessage=messageSource.getMessage(fieldError,currentLocale);
logger.info(“将错误消息-”+错误消息+“-添加到错误列表”);
errorsList.addFieldError(fieldError.getField(),errorMessage);
}
返回错误列表;
}
}
永远不会调用标有@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
请参阅本文,了解如何使用curl发布JSON数据:

此外,以下是有关MessageConverters的相关Spring文档:

我的
@RestController
中也有同样的问题。当我将
@Controller
@RequestBody
@ResponseBody
结合使用时,它会工作。你有没有可能解决这个问题?我只是回答了我的问题。请看下面。尽管你的问题可能有所不同。这两种方式都应该有效。
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