Как получить текст ошибки в контроллере от BindingResult

У меня есть контроллер, который возвращает 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, но он не имеет фактических ошибок.

25
задан Mike 1 May 2010 в 21:40
поделиться

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>

Вставьте свой экземпляр 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);
36
ответ дан 28 November 2019 в 18:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: