我有一个Spring Boot REST服务器,当提供无效输入时,它应该返回特定的错误代码。我在这里不需要任何i18n,只需要像“缺失”这样的简单英文错误代码即可。
将Spring Boot与Hibernate Validator一起使用,验证后我得到一个Spring Errors
对象。
对于每个错误,我都可以获得code
和defaultMessage
。对于@NotBlank约束,这将返回NotBlank
和may not be null
resp。
基本上我想将此错误翻译为missing
,因为我对i18n翻译不感兴趣。还有其他约束我想要更多REST友好的错误代码。
我虽然在messages.properties
内使用简单的ValidationMessages.properties
或src/main/resources
,但遗憾的是这不起作用。注意我尝试添加常规NotBlank=missing
和特定NotBlank.entity.field=missing
属性。
我不确定为什么它不起作用...也许是因为解析i18n消息(在jsp世界中)并不直接通过Spring Errors
而是通过MessageCodesResolver
实现(只是猜测)。
可能我可以从Spring Error
获取错误代码并从消息代码解析器中进行查找。
但我想知道为什么error.getDefaultMessage
没有从ValidationMessages.properties
返回适当的值。
欢迎提出任何建议。
答案 0 :(得分: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
),然后您可以在带有占位符的消息中使用这些参数。