SpringBoot错误消息插值不适用于自定义验证器

时间:2018-12-06 10:30:44

标签: spring-boot java-8 bean-validation

我将org.springframework.validation和JSR-303注释混合在一起。

JSR-303注释:

    public class Model{

        private String type;

        private State state;

        @NotNull(message = "{comment.notnull}")
        private String comment;
    }

Spring框架验证:

@Component
public class ModelValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return Model.class.equals(clazz);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        Model model = (Model) obj;

        if (eventModel.getState() == null) {
            errors.reject("state", "error.state.invalidState");
        }
    }
}

我的ValidationMessages_en.properties

error.state.invalidState=Invalid state.
comment.notnull=Comment not null.

然后我的配置:

@Configuration
public class ValidationConfig {

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("ValidationMessages");
        return messageSource;
    }
}

当我运行springboot应用程序时,插值适用于JSR-303,但不适用于自定义验证器,我错过了什么吗?尝试了很长时间,但找不到。

结果:

"error_messages": [
    {
        "error_message": "Comment not null"
    },
    {
        "error_message": "error.state.invalidState"
    }
]

2 个答案:

答案 0 :(得分:2)

我不确定是否有任何简便的方法,但最终我不得不这样做,

添加到组件

之下
import java.util.Locale;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.stereotype.Component;

@Component
public class Messages {
    @Autowired
    private MessageSource messageSource;

    private MessageSourceAccessor accessor;

    @PostConstruct
    private void init() {
    accessor = new MessageSourceAccessor(messageSource, Locale.ENGLISH);
    }

    public String get(String property) {
    return accessor.getMessage(property);
    }

}

然后,我将把这个组件注入到我的验证器中,并使用上述类的get("error.state.invalidState")方法,而不是直接使用error.state.invalidState

messageSource是您已经在系统中定义的bean。可以外部化语言环境,并且可以使用其他配置设置默认语言环境。

MessageSourceAccessor有很多重载的方法,如果希望提供这些选项,也可以直接将其公开。

答案 1 :(得分:0)

我认为您在两种方法之间感到困惑:

reject(String errorCode, String defaultMessage)

rejectValue(String field, String errorCode)

您的配置看起来不错,只需执行以下操作即可解决您的问题:

errors.rejectValue("state", "error.state.invalidState");

errors.reject("error.state.invalidState", "Some default message to fallback!");