У меня есть контроллер, который возвращает JSON. Это принимает форму, которая проверяет себя с помощью пружинных аннотаций. Я могу получить список FieldError от BindingResult, но они не содержат текст, который 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, но он не имеет фактических ошибок.
Отказ от ответственности: я до сих пор не использую 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>
Вставьте свой экземпляр MessageSource в свой View
@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);