我将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"
}
]
答案 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!");