【发布时间】:2015-02-27 00:35:52
【问题描述】:
我有一个 Spring Boot REST 服务器,当提供无效输入时它应该返回特定的错误代码。我这里不需要任何 i18n,只需简单的英文错误代码,如“missing”就足够了。
将 Spring Boot 与 Hibernate Validator 一起使用,验证后我得到一个返回 Spring Errors 对象。
对于每个错误,我可以获得code 和defaultMessage。对于@NotBlank 约束,这将分别返回NotBlank 和may not be null。
基本上我想将此错误翻译为 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 返回适当的值。
欢迎提出任何建议。
【问题讨论】:
-
因为
error.getDefaultMessage获取默认消息,这是由代码而不是属性文件生成的消息。如果您查看MessageSource.getMessage方法,您会看到defaultMessage被传入。使用验证时使用相同的机制。 -
谢谢解释!你有什么建议继续前进?
-
您可以将错误(原样)传递给
MessageSource,从Errors对象返回的错误都是MessageSourceResolvable的所有实例。所以只需遍历错误,将它们传递给MessageSource并从messages.properties获取您想要的消息。也许你可以把这个逻辑中产阶级化,把它放在一个生成响应对象的类中。 -
是的,正如我自己建议的那样。谢谢!
-
好吧,您建议使用代码,您不必这样做,只需按原样传递对象即可。
标签: spring spring-mvc spring-boot hibernate-validator