如何从BindingResult获取控制器中的错误文本

我有一个返回JSON的控制器。 它采用一种forms,通过弹簧注释validation自己。 我可以从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 errors; private Map data; ...getters and setters... } 

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

免责声明:我仍然不使用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()); } } 

我希望它对你有用

UPDATE

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

    

在View中注入MessageSource实例

 @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); } } 

你的validation器应该是这样的

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

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

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

无需更改/添加消息源。

使用Java 8 Streams

 bindingResult .getFieldErrors() .stream() .forEach(f -> System.out.println(f.getField() + ": " + f.getDefaultMessage())); 

BEAN XML:

    messages       

JAVA:

 for (FieldError error : errors.getFieldErrors()) { logger.debug(messageAccessor.getMessage(error)); } 

注意:调用Errors.getDefaultMessage()不一定会返回从代码+ args生成的相同消息。 defaultMessage是在调用Errors.rejectValue()方法时定义的单独值。 请参阅Errors.rejectValue()API

WebMvcConfigurerAdapter:

 @Bean(name = "messageSourceAccessor") public org.springframework.context.support.MessageSourceAccessor messageSourceAccessor() { return new MessageSourceAccessor( messageSource()); } 

控制器:

 @Autowired @Qualifier("messageSourceAccessor") private MessageSourceAccessor messageSourceAccessor; ... StringBuilder sb = new StringBuilder(); for (ObjectError error : result.getAllErrors()) { if ( error instanceof FieldError) { FieldError fe = (FieldError) error; sb.append( fe.getField()); sb.append( ": "); } sb.append( messageSourceAccessor.getMessage( error)); sb.append( "
"); }