Spring 如何对验证消息使用不同的错误代码?
我有一个SpringBootREST服务器,当提供无效输入时,它应该返回特定的错误代码。这里我不需要任何i18n,只需要简单的英文错误代码,如“missing”就足够了 使用带有Hibernate验证程序的Spring引导,在验证之后,我得到一个back-SpringSpring 如何对验证消息使用不同的错误代码?,spring,spring-mvc,spring-boot,hibernate-validator,Spring,Spring Mvc,Spring Boot,Hibernate Validator,我有一个SpringBootREST服务器,当提供无效输入时,它应该返回特定的错误代码。这里我不需要任何i18n,只需要简单的英文错误代码,如“missing”就足够了 使用带有Hibernate验证程序的Spring引导,在验证之后,我得到一个back-SpringErrors对象 对于每个错误,我都可以得到code和defaultMessage。对于@NotBlank约束,这将返回NotBlank,可能不为空 基本上我只想把这个错误翻译成missing,因为我对i18n翻译不感兴趣。还有其他
Errors
对象
对于每个错误,我都可以得到code
和defaultMessage
。对于@NotBlank约束,这将返回NotBlank
,可能不为空
基本上我只想把这个错误翻译成missing
,因为我对i18n翻译不感兴趣。还有其他约束,我希望得到更为REST友好的错误代码
我想在src/main/resources
内部使用一个简单的messages.properties
或ValidationMessages.properties
,但不幸的是,这不起作用。注意:我尝试了添加常规NotBlank=missing
和特定NotBlank.entity.field=missing
属性
我不知道为什么它不起作用。。。可能是因为解析i18n消息(在jsp世界中)不是直接通过SpringErrors
,而是通过MessageCodesResolver
实现(只是猜测)
可能我可以从Springerror
中获取错误代码,并从消息代码解析器中进行查找。
但是我想知道为什么error.getDefaultMessage
没有从ValidationMessages.properties
返回适当的值
欢迎任何建议。默认消息是程序员声明的消息。对于那些JSR-303注释,可能是Hibernate想到的注释。包含代码的默认消息被传递给方法,该方法包含一个参数defaultMessage
当您查看Errors
对象或实际的ObjectError
方法时,您将看到它实现了MessageSourceResolvable
接口。这意味着您可以按原样将错误传递给消息源
,包括区域设置
(如果需要)
@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
)然后可以在消息中使用占位符。因为错误。getDefaultMessage
获取默认消息,该消息由代码生成,而不是从属性文件生成。如果查看该方法,您会看到传入了defaultMessage
。使用validation.Thx进行解释时使用了相同的机制!您建议如何继续?您只需将错误(按原样)传递给消息源
从错误
对象返回的错误都是消息源可解析
的实例。因此,只需迭代错误,将它们传递到MessageSource
,并从messages.properties
中获取所需的消息。也许你可以对这个逻辑进行绅士化,把它放在一个生成响应对象的类中。谢谢!您建议使用代码,您不必这样做,只需按原样传递对象。Ps hibernate验证程序默认消息应通过ValidationMessages.properties覆盖,但似乎不起作用(至少在Spring应用程序中)。另请参阅更正,因为它覆盖了该机制,因此可以使用MessageSource
。ValidationMessages.properties
应用于普通的JSR-303。这在javadoc.Hmm中已经解释过了。有可能在春季改变这种行为吗?所以要使用ValidationMessages.properties?我们是否能够在不在每个控制器中注入消息源
和区域设置
的情况下自动解析错误消息?这真的很麻烦,因为我可以在hibernate注释中完成,但为什么SpringValidator不能工作。