Spring 如何对验证消息使用不同的错误代码?

Spring 如何对验证消息使用不同的错误代码?,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翻译不感兴趣。还有其他

我有一个SpringBootREST服务器,当提供无效输入时,它应该返回特定的错误代码。这里我不需要任何i18n,只需要简单的英文错误代码,如“missing”就足够了

使用带有Hibernate验证程序的Spring引导,在验证之后,我得到一个back-Spring
Errors
对象

对于每个错误,我都可以得到
code
defaultMessage
。对于@NotBlank约束,这将返回
NotBlank
可能不为空

基本上我只想把这个错误翻译成
missing
,因为我对i18n翻译不感兴趣。还有其他约束,我希望得到更为REST友好的错误代码

我想在
src/main/resources
内部使用一个简单的
messages.properties
ValidationMessages.properties
,但不幸的是,这不起作用。注意:我尝试了添加常规
NotBlank=missing
和特定
NotBlank.entity.field=missing
属性

我不知道为什么它不起作用。。。可能是因为解析i18n消息(在jsp世界中)不是直接通过Spring
Errors
,而是通过
MessageCodesResolver
实现(只是猜测)

可能我可以从Spring
error
中获取错误代码,并从消息代码解析器中进行查找。 但是我想知道为什么
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不能工作。