如何从Spring MVC控制器返回错误状态和validation错误?
我在我的一个控制器中有一个这样定义的动作方法:
@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; } }
当post成功保留时,我将post返回给客户端。 但是当它有validation错误时,我想将错误状态代码以及所有validation错误消息返回给客户端。
最好的方法是什么?
正如您所设计的那样,您需要创建自己的Pojo(aka。资源),这将代表奇怪的行为或validation错误,正如horaceman所述。 我将在我们的应用程序中向您展示我们是如何做到的。
由于我们使用JSON作为数据表示,因此如果发生意外exception,我们希望收到以下信息。
{ "status" : "EXCEPTION", "exceptionName" : "MyCustomException", "exceptionMsg" : "ex.unsupportedOperation" }
这是一个例子。 关于它的一个很好的解决方案是我们可以将exceptionMsg
视为我们前端的一个键,以显示正确的i18n
消息或将其显示给用户(在这种情况下,我们使用更多的描述性消息)。
现在,当一切正常时,我们会这样做:
{ "status" : "OK", "data" : {(...)} }
Data
元素是可选的。 我们可以发送任何我们需要通知前端的内容,或完全跳过它。
最后一个场景是你的 – validation错误。 在这种情况下,我们通常发送以下内容:
{ "status" : "VALIDATION_FAILED", "errors" : [ "fieldName" : "username", "errorCode" : "validation.requiredField", "errorMsg" : "Username is required."] }
很明显,API客户端将收到validation失败的信息,并在适当的字段中显示错误的详细信息。 当然, errors
是一个数组(或List
),因此我们总是根据需要提供尽可能多的细节。
我是怎么做到的 很简单,那些对象是简单的POJOS,使用Jackson翻译成JSON。 这给了我无限的JSON表示可能性。 我所做的是,我正在准备表示validation错误的POJO(例如)并将其作为Model
添加到我的ModelAndView
实例中。 然后我只依靠Spring来做适当的JSON编组。
在你的情况下,你的Post
实例有@ResponseBody
注释,所以据我所知你将无法做到这一点。 你的设置是说“好吧,不管发生了什么 – 总是返回Post的实例”。 你应该做的是用简单的ModelAndView
替换它,根据validation为它提供适当的Model
并将其返回给客户端API。
对于@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) { // ... }
我想你想在你的控制器中进行ajax调用。 您在方法中返回一个post对象,因此无法返回另一个对象(例如带代码的错误消息)。 如何返回ExecutionResult呢?
ExecutionResult{ private int statusCode; private String message; private Object yourPost; //get and set methods here... }