2010-05-01 220 views
19

我有一個返回JSON的控制器。它採用一種形式,通過Spring註釋驗證自己。我可以從BindingResult獲取FieldError列表,但它們不包含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中使用的同樣的方法也fullfil您的需求

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

如果你想要得到的消息,你的資源包提供的,你需要一個registe紅色爲messageSource實例(它必須被稱爲爲messageSource)

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

注入你的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); 
    } 
} 

你驗證器應該看起來像

/** 
    * 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以下operties: 「answerform.questionId.invalid =無效的問題ID:{0}」。 fieldError.getCode()將返回「answerform.questionId.invalid」,我正在查找錯誤本身,而不是代碼,例如:「無效的問題ID:123」 – Mike 2010-05-03 17:03:04

+0

@Mike請參閱**更新**! – 2010-05-03 20:10:26

+0

@Mike如果我的回答滿足您的需求,是否有可能將您標記爲已接受? – 2010-05-05 03:48:17

19

我最近遇到這個問題,並發現了一個更簡單的方法(也許是春季3的支持)

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

有沒有必要改變/添加的消息源。

+0

@ J.Wincewicz:對不批准您的編輯建議感到抱歉。上面的代碼是我在Spring 3中測試過的(並且正在運行)。你的代碼建議使用一種新方法,我不能100%確定它會使用這個舊版本的Spring。不過,您可以將其作爲單獨的回覆或評論發佈在此帖子中。 – 2017-10-06 03:31:15

1

BEAN 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()不一定返回時產生相同的消息從代碼+參數。 defaultMessage是調用Errors.rejectValue()方法時定義的單獨值。見Errors.rejectValue() API Here

3

與Java 8流

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 2017-11-24 02:18:43

相關問題