2014-12-30 55 views
1

我有一个Spring Boot REST服务器,它应该在提供无效输入时返回特定的错误代码。我在这里不需要任何i18n,只是简单的英文错误代码,比如'缺少'就足够了。如何为验证消息使用不同的错误代码?

使用带有Hibernate Validator的Spring Boot,验证后我得到一个回弹簧Errors对象。

对于每个错误我可以得到codedefaultMessage。对于@NotBlank约束,这将返回NotBlank和​​。

基本上我想把这个错误翻译成missing,因为我对i18n翻译不感兴趣。还有其他的限制,我想更多的REST友好的错误代码。

我虽然要使用简单的messages.propertiesValidationMessages.properties内部src/main/resources但这不会工作不幸。注意我试着添加一个通用的NotBlank=missing和特定的NotBlank.entity.field=missing属性。

我不知道为什么它不工作...也许是因为解决国际化的消息(在JSP世界)不直接通过Spring Errors而是通过MessageCodesResolver实现(只是猜测)。

也许我可以从Spring Error得到错误代码,并从消息代码解析器中进行查找。 但我想知道为什么error.getDefaultMessage不会从ValidationMessages.properties返回适当的值。

任何建议是值得欢迎的。

+0

因为'error.getDefaultMessage'获取默认消息,并且这是由代码生成的消息,而不是来自属性文件。如果您查看['MessageSource.getMessage'](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/MessageSource.html#getMessage-java.lang.String -java.lang.Object:A-java.lang.String-java.util.Locale-)方法,您会看到传入了'defaultMessage'。使用验证时将使用相同的机制。 –

+0

Thx解释!你会提出什么建议前进? –

+0

您可以将错误(按原样)传递给'MessageSource',从'Errors'对象返回的错误都是'MessageSourceResolvable'的实例。因此,只需遍历错误,将它们传递给'MessageSource'并从'messages.properties'获取所需的消息。也许你可以对这个逻辑进行gentrify并把它放在一个产生响应对象的类中。 –

回答

1

默认消息是程序员声明的消息。在那些JSR-303注释的情况下,可能是Hibernate认为它们的那些。包括代码的默认消息传递给MessageSource.getMessage方法,其中包含一个参数defaultMessage

当你看Errors对象或实际的ObjectError方法,你会看到,它实现了MessageSourceResolvable接口。这意味着您可以将错误原样传递到MessageSource,包括Locale(如果需要)。

@RequestMapping 
public Object foo(@Valid @RequestBody MyObject obj, Errors errors, Locale locale) { 
    for (ObjectError err : errors.getAllErrors()) { 
     String msg = messageSource.getMessage(err, locale); 
     // Do something with msg 
    } 
} 

像上面这样的东西应该可以解决这个问题。使用ObjectError本身的好处是,在代码旁边还有参数(对于@Range@Min),然后可以在占位符中使用消息。

+0

PS hibernate验证器默认消息应该通过ValidationMessages.properties覆盖,但似乎不起作用(至少在Spring应用程序中)。另请参阅https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/chapter-message-interpolation.html –

+0

正确,因为它覆盖了该机制,因此可以使用“MessageSource”。 'ValidationMessages.properties'适用于普通的JSR-303。这在['LocalValidatorFactoryBean'](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.html)javadoc中有解释。 –

+0

嗯,有可能在春季改变这种行为?那么要使用ValidationMessages.properties? –