2010-05-01 3 views
19

У меня есть контроллер, который возвращает JSON. Он принимает форму, которая проверяет себя через весенние аннотации. Я могу получить список FieldError из BindingResult, но они не содержат текст, который JSP будет показывать в теге. Как я могу получить текст ошибки для отправки обратно в JSON?Как получить текст ошибки в контроллере от BindingResult

@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, но это не имеет фактических ошибок.

ответ

29

Отказ от ответственности: Я до сих пор не использовать 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)

<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); 
+1

Скажем, у меня есть следующие в ValidationMessages.pr Операции: "answerform.questionId.invalid = Недопустимый идентификатор вопроса: {0}." fieldError.getCode() вернет «answerform.questionId.invalid», я ищу ошибку, а не код, например: «Недопустимый идентификатор вопроса: 123» – Mike

+0

@Mike См. ** Обновление **! –

+0

@Mike Если мой ответ наполнит ваши потребности, можно ли пометить его как принято ??? –

19

Я встретил эту проблему недавно, и нашел более простой способ (возможно, это поддержка Spring 3)

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

Там нет необходимости изменить/добавить источник сообщения.

+0

@ J.Wincewicz: жаль, что вы не одобряете свое предложение по редактированию. Вышеприведенный код I, который я тестировал (и работает) весной 3. В вашем коде предлагается использовать новый метод, который я не на 100% уверен, что он будет работать с этой старой версией Spring. Вы можете опубликовать его как отдельный ответ или комментарии к этому сообщению. –

1

БИН XML:

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

<bean id="messageAccessor" class="org.springframework.context.support.MessageSourceAccessor"> 
    <constructor-arg index="0" ref="messageSource"/> 
</bean> 

JAVA:

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

Примечание: Вызов Errors.getDefaultMessage() не обязательно будет возвращать то же самое сообщение, которое генерируется из кода + args. Значение по умолчаниюMessage - это отдельное значение, определенное при вызове метода Errors.rejectValue().См Errors.rejectValue() API Here

3

С Java 8 Streams

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

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("<br />"); 
} 
+0

Возможно, несколько более подробное объяснение было бы полезно. – Nubok

 Смежные вопросы

  • Нет связанных вопросов^_^