2010-05-01 10 views
19

Tengo un controlador que devuelve JSON. Toma una forma, que se valida a sí misma a través de anotaciones de primavera. Puedo obtener la lista FieldError de BindingResult, pero no contienen el texto que un JSP mostraría en la etiqueta. ¿Cómo puedo obtener el texto de error para enviar de vuelta en JSON?Cómo obtener el texto de error en el controlador desde 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; 
    } 

} 

clase JSONREsponse es sólo un 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... 
} 

Calling BindingResult.getAllErrors() devuelve una matriz de objetos FieldError, pero no tiene los errores reales.

Respuesta

29

responsabilidad: Todavía no utilice Primavera-MVC 3.0

pero creo que el mismo criterio utilizado para la primavera de 2,5 puede fullfil sus necesidades

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

espero que pueda ser útil para usted

ACTUALIZACIÓN

Si desea obtener el mensaje proporcionado por el paquete de recursos, se necesita un empadronados rojo ejemplo MessageSource (Se necesidad ser llamado MessageSource)

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

inyecte el ejemplo MessageSource dentro de la vista

@Autowired 
private MessageSource messageSource; 

Y para transmitir su mensaje, haga lo siguiente

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

Su El validador debe verse como

/** 
    * 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

Digamos que he siguiente en ValidationMessages.pr operties: "answerform.questionId.invalid = Id. de pregunta no válida: {0}." fieldError.getCode() devolverá "answerform.questionId.invalid", estoy buscando el error en sí, no el código, por ejemplo: "ID de pregunta no válida: 123" – Mike

+0

@Mike ¡Vea ** Actualización **! –

+0

@Mike Si mi respuesta satisface sus necesidades, ¿sería posible que la marque como aceptada? –

19

me encontré con este problema hace poco, y encontró una manera más fácil (tal vez es el soporte de la primavera 3)

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

No hay necesidad de cambiar/añadir la fuente del mensaje.

+0

@ J.Wincewicz: lo siento por no aprobar su sugerencia de edición. El código anterior I es lo que probé (y ejecuté) en la primavera 3. Su código sugiere usar un nuevo método, que no estoy 100% seguro de que funcionará con esta versión anterior de Spring. Sin embargo, puede publicarlo como una respuesta separada o comentarios en esta publicación. –

1

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

NOTA: Calling Errors.getDefaultMessage() no necesariamente va a devolver el mismo mensaje que se genera del código + args. El defaultMessage es un valor separado definido al llamar al método Errors.rejectValue().Ver Errors.rejectValue() API Here

3

con Java 8 Flujos

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

controlador:

@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

Quizás una explicación algo más detallada sería útil. – Nubok

Cuestiones relacionadas