Я смешал оба org.springframework.validation вместе с аннотацией JSR-303.
Аннотация JSR-303:
public class Model{
private String type;
private State state;
@NotNull(message = "{comment.notnull}")
private String comment;
}
Проверка Spring framework:
@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"
}
]




Я не уверен, есть ли какой-нибудь простой способ, но в конце концов мне пришлось сделать вот так,
Добавлен ниже компонент,
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 имеет множество перегруженных методов, вы также можете напрямую раскрыть их, если хотите предоставить эти параметры.
Думаю, вы перепутали два метода:
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!");
Да, ваш метод действительно работает, я подожду некоторое время, чтобы посмотреть, есть ли лучший ответ, если нет, я приму ваш. Спасибо!!