如何从绑定结果获取控制器中的错误文本

我有一个返回 JSON 的控制器。它采用一种形式,通过弹簧注释来验证自己。我可以从 BindingResult 获取 FieldError 列表,但它们不包含 JSP 在标记中显示的文本。如何获取要以 JSON 格式发回的错误文本?

@RequestMapping(method = RequestMethod.POST)
public
@ResponseBody
JSONResponse submit(@Valid AnswerForm answerForm, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response) {

    if (result.hasErrors()) {
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        JSONResponse r = new JSONResponse();
        r.setStatus(JSONResponseStatus.ERROR);
        //HOW DO I GET ERROR MESSAGES OUT OF BindingResult??? 
    } else {
        JSONResponse r = new JSONResponse();
        r.setStatus(JSONResponseStatus.OK);
        return r;
    }

}

JSONREsponse类只是一个POJO

public class JSONResponse implements Serializable {
    private JSONResponseStatus status;
    private String error;
    private Map<String,String> errors;
    private Map<String,Object> data;

...getters and setters...
}

调用 BindingResult.getAllErrors() 返回一个 FieldError 对象数组,但它没有实际的错误。


答案 1

免责声明:我仍然不使用Spring-MVC 3.0

但我认为Spring 2.5使用的相同方法可以满足您的需求

for (Object object : bindingResult.getAllErrors()) {
    if(object instanceof FieldError) {
        FieldError fieldError = (FieldError) object;

        System.out.println(fieldError.getCode());
    }

    if(object instanceof ObjectError) {
        ObjectError objectError = (ObjectError) object;

        System.out.println(objectError.getCode());
    }
}

我希望它对你有用

更新

如果要获取资源包提供的消息,则需要一个已注册的 messageSource 实例(必须称为 messageSource)

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames" value="ValidationMessages"/>
</bean>

将消息源实例注入视图

@Autowired
private MessageSource messageSource;

要获取您的消息,请执行以下操作

for (Object object : bindingResult.getAllErrors()) {
    if(object instanceof FieldError) {
        FieldError fieldError = (FieldError) object;

        /**
          * Use null as second parameter if you do not use i18n (internationalization)
          */

        String message = messageSource.getMessage(fieldError, null);
    }
}

您的验证器应如下所示

/**
  * Use null as fourth parameter if you do not want a default message
  */
errors.rejectValue("<FIELD_NAME_GOES_HERE>", "answerform.questionId.invalid", new Object [] {"123"}, null);

答案 2

我最近遇到了这个问题,并找到了一种更简单的方法(也许是Spring 3的支持)

    List<FieldError> errors = bindingResult.getFieldErrors();
    for (FieldError error : errors ) {
        System.out.println (error.getObjectName() + " - " + error.getDefaultMessage());
    }

无需更改/添加消息源。