【问题标题】:How to use different error codes for validation messages?如何对验证消息使用不同的错误代码?
【发布时间】:2015-02-27 00:35:52
【问题描述】:

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

将 Spring Boot 与 Hibernate Validator 一起使用,验证后我得到一个返回 Spring Errors 对象。

对于每个错误,我可以获得codedefaultMessage。对于@NotBlank 约束,这将分别返回NotBlankmay not be null

基本上我想将此错误翻译为 missing,因为我对 i18n 翻译不感兴趣。还有其他约束我想要更 REST 友好的错误代码。

我虽然在src/main/resources 中使用简单的messages.propertiesValidationMessages.properties,但不幸的是,这不起作用。请注意,我尝试添加通用 NotBlank=missing 和特定 NotBlank.entity.field=missing 属性。

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

可能我可以从 Spring Error 获取错误代码并从消息代码解析器中进行查找。 但我想知道为什么error.getDefaultMessage 没有从ValidationMessages.properties 返回适当的值。

欢迎提出任何建议。

【问题讨论】:

  • 因为error.getDefaultMessage 获取默认消息,这是由代码而不是属性文件生成的消息。如果您查看MessageSource.getMessage 方法,您会看到defaultMessage 被传入。使用验证时使用相同的机制。
  • 谢谢解释!你有什么建议继续前进?
  • 您可以将错误(原样)传递给MessageSource,从Errors 对象返回的错误都是MessageSourceResolvable 的所有实例。所以只需遍历错误,将它们传递给MessageSource 并从messages.properties 获取您想要的消息。也许你可以把这个逻辑中产阶级化,把它放在一个生成响应对象的类中。
  • 是的,正如我自己建议的那样。谢谢!
  • 好吧,您建议使用代码,您不必这样做,只需按原样传递对象即可。

标签: spring spring-mvc spring-boot hibernate-validator


【解决方案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),然后您可以在消息中使用占位符。

【讨论】:

  • Ps 休眠验证器默认消息应通过 ValidationMessages.properties 覆盖,但似乎不起作用(至少在 Spring 应用程序中)。另请参阅docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/…
  • 正确,因为这会覆盖该机制,以便可以使用 MessageSourceValidationMessages.properties 适用于普通的 JSR-303。这在LocalValidatorFactoryBean javadoc 中有解释。
  • 嗯,有可能在 Spring 中改变这种行为吗?那么要使用 ValidationMessages.properties 吗?
  • 我们是否能够在不向每个控制器中注入 message sourcelocale 的情况下自动解决错误消息?这真的很麻烦,因为我可以在hibernate注释中做到但为什么Spring验证器不起作用。
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2013-08-20
  • 1970-01-01
相关资源
最近更新 更多