如何从此Spring MVC控制器返回错误状态和验证错误?
问题内容:
我在一个控制器中定义了一个这样的操作方法:
@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;
}
}
成功保留帖子后,我将帖子返回给客户端。但是,当它包含验证错误时,我想将错误状态代码以及所有验证错误消息返回给客户端。
最好的方法是什么?
问题答案:
正当您正在设计REST
api时,您需要创建自己的Pojo(又名Resource),该Pojo将代表奇怪的行为或验证错误,如horaceman所述。我将向您展示我们如何在应用程序中做到这一点。
由于我们使用JSON作为数据表示形式,因此,如果发生意外的异常,我们希望收到以下信息。
{ "status" : "EXCEPTION", "exceptionName" : "MyCustomException", "exceptionMsg" : "ex.unsupportedOperation" }
这当然是一个例子。不错的解决方案是,我们可以将其exceptionMsg
视为前端中的键,以显示正确的i18n
消息或将其按原样显示给用户(在这种情况下,我们使用更具描述性的消息)。
现在,当一切正常时,我们将执行以下操作:
{ "status" : "OK", "data" : {(...)} }
Data
元素是可选的。我们可以发送任何需要通知前端的信息,或者完全跳过它。
最后一种情况是您的-验证错误。在这种情况下,我们通常发送以下内容:
{ "status" : "VALIDATION_FAILED", "errors" : [ "fieldName" : "username", "errorCode" : "validation.requiredField", "errorMsg" : "Username is required."] }
显然,API客户端将在正确的字段中接收到验证失败的信息-
有关错误原因的确切详细信息。当然errors
是一个数组(或List
),所以我们总是根据需要提供尽可能多的细节。
我该怎么做?
这些对象很简单,就是简单的POJOS,可以使用Jackson将其转换为JSON。这给了我无限可能的JSON表示形式。我正在做的是准备代表验证错误的POJO(例如),并将其添加Model
到我的ModelAndView
实例中。然后,我仅依靠Spring进行正确的JSON封送处理。
就您而言@ResponseBody
,您的Post
实例具有注释,据我所知您将无法执行此操作。您的设置是说“好吧,无论发生什么情况-
始终返回Post实例”。您应该做的是将其替换为simple
ModelAndView
,并Model
根据验证为其提供适当的信息,并将其返回给客户端API。