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

时间:2014-12-30 20:48:36

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

我有一个Spring Boot REST服务器,当提供无效输入时,它应该返回特定的错误代码。我在这里不需要任何i18n,只需要像“缺失”这样的简单英文错误代码即可。

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

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

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

我虽然在messages.properties内使用简单的ValidationMessages.propertiessrc/main/resources,但遗憾的是这不起作用。注意我尝试添加常规NotBlank=missing和特定NotBlank.entity.field=missing属性。

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

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

欢迎提出任何建议。

1 个答案:

答案 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),然后您可以在带有占位符的消息中使用这些参数。