如何从此Spring MVC控制器返回错误状态和验证错误?

2022-09-04 19:59:09

我在我的一个控制器中有一个这样的操作方法:

@RequestMapping(method = RequestMethod.POST)
public @ResponseBody Post create(@Valid Post post, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        // how to return an error status + error messages from here?
    } else {
        postRepository.persist(post);
        return post;
    }
}

成功保留帖子后,我将帖子返回给客户端。但是当它有验证错误时,我想将错误状态代码以及所有验证错误消息返回给客户端。

最好的方法是什么?


答案 1

因为你正在设计一个REST api,你需要创建自己的Pojo(又名。资源),这将代表奇怪的行为或验证错误,如horaceman所述。我将向您展示我们如何在应用程序中执行此操作。

由于我们使用 JSON 作为数据表示形式,因此如果发生意外异常,我们希望收到以下信息。

{ "status" : "EXCEPTION", "exceptionName" : "MyCustomException", "exceptionMsg" : "ex.unsupportedOperation" }

这当然是一个例子。关于它的一个很好的解决方案是,我们可以将其视为前端的键来显示正确的消息或按原样向用户显示它(在这种情况下,我们使用更具描述性的消息)。exceptionMsgi18n

现在,当一切正常时,我们做这样的事情:

{ "status" : "OK", "data" : {(...)} }

Data元素是可选的。我们可以发送任何我们需要通知前端的内容,也可以完全跳过它。

最后一种情况是你的 - 验证错误。在这种情况下,我们通常会发送以下内容:

{ "status" : "VALIDATION_FAILED", "errors" : [ "fieldName" : "username", "errorCode" : "validation.requiredField", "errorMsg" : "Username is required."] }

因此,API客户端显然将在适当的字段中收到验证失败的信息 - 有关出错的确切详细信息。当然是数组(或),因此我们始终根据需要提供尽可能多的细节。errorsList

我该怎么做?很简单,这些对象是简单的POJOS,使用Jackson将其转换为JSON。这为我提供了JSON表示的无限可能性。我所做的是,我正在准备代表验证错误的POJO(例如),并将其作为我的实例添加。然后,我只依靠Spring来做适当的JSON封送处理。ModelModelAndView

在你的情况下,你有你的实例的注释,所以据我所知,你将无法做到这一点。您的设置是说“好吧,无论发生什么 - 始终返回Post的实例”。您应该做的是将其替换为 简单 ,根据验证为其提供适当的内容并将其返回到客户端API。@ResponseBodyPostModelAndViewModel


答案 2

对于@ResponseBody我会从方法签名中删除BindigResult,并让BindException被抛出。然后,我将使用@ExceptionHandler方法来返回包含 Likacz 所描述的错误的对象。

@RequestMapping(method = RequestMethod.POST)
public @ResponseBody Post create(@Valid Post post) {
    postRepository.persist(post);
    return post;
}

@ExceptionHandler
public ValidationErrors handleException(BindException ex) {
  // ...
}

推荐