当前位置: 首页 > 知识库问答 >
问题:

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

邹书
2023-03-14

为什么Rest控制器会抛出BindException或返回空的ModelandView?

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

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;
    }
}
public class TasksCommand {

    @NotBlank
    @NotNull
    private String name;

    private Calendar due;

    private String category;

    ... getters & setters ommitted ...
}
@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;
    }
}

我有几个支持类--Task、TaskCommand、Error和ErrorsList--如果需要,我可以发布代码。

共有1个答案

厍华清
2023-03-14

问题出在我的curl命令上。

curl-d发送内容类型“application/x-www-form-urlencoded”。结果,Spring将数据解释为web表单数据(而不是JSON)。Spring使用FormHttpMessageConverter将POST主体转换为域对象,并导致BindException。

我们希望Spring将POST数据视为JSON,并使用MappingJackson2HttpMessageConverter将POST主体解析为Object。这可以通过使用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
 类似资料:
  • 我试图在完全使用JavaConfig配置的Spring MVC应用程序中使用处理404错误。 Spring MVC版本为4.1.5 我读过这样的话: null SpringConfigurationInitializer 请注意,我正在使用 而且 MVC配置 存储配置 安全配置

  • 我在我的应用程序中启用了应用链接。它工作正常。但是在我的应用程序中,有一些情况下我无法处理传入的网址。在这种情况下,我想将该网址重定向到设备中的默认浏览器。 目前,我尝试使用intent打开带有url的浏览器,但它再次重定向到我的应用程序本身。应用程序链接的格式如下- 所以根据params,我想要么在应用程序本身中处理应用程序链接,要么将其重定向到默认浏览器。下面是我试图用上面的网址打开浏览器的代

  • 我有一个带post请求的控制器。我试图用一个简单的NotNull注释验证POJO。我正在使用ControllerAdvice来处理异常。 所以我尝试使用它,但当我启动应用程序时,我得到了以下信息: 因此,我想为BindException创建自己的处理程序,但当我为BindException类创建ExceptionHandler时,spring应用程序不会启动。如果我注释掉handleBindExc

  • 我正在运行一个spring boot WebFlux应用程序,通常该应用程序运行在Netty嵌入式服务器之上。相反,我正在运行一个tomcat实例,我试图从我的pom中排除tomcat,但仍然遇到同样的问题。 所以我想通过运行Netty而不是Tomcat来解决这个问题。 这是我的pom依赖项:

  • 希望有人能帮我找出,如果不是一个解决方案,至少是一个行为的解释。 问题: 在一些设备上,按下启动器图标会导致当前任务恢复,在其他设备上,会导致初始启动意图被激发(有效地重新启动应用程序)。为什么会这样? 细节: 当您按下“启动程序图标”时,应用程序会正常启动-也就是说,我假设,使用您的第一个和操作和类别。然而,情况并非总是如此: 在大多数设备上,如果您在应用程序已经运行后按下启动器图标,则会恢复该

  • 我正在尝试使用Android Studio3.6.3和我的手机制作一个应用程序来测试它。我遇到了一个问题,我认为卸载这个应用程序是个好主意,但现在,Android studio不知道我的手机上不存在这个应用程序,它试图运行文件。错误是: 05/27 21:03:30:在小米红米Note 7上启动“MainActivity”。 启动活动时出错 我怎样才能欺骗它重新安装正确的应用程序?