Интерполяция сообщения об ошибке Springboot не работает для настраиваемого валидатора

Я смешал оба 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"
    }
]
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
4
0
1 586
2

Ответы 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 имеет множество перегруженных методов, вы также можете напрямую раскрыть их, если хотите предоставить эти параметры.

Да, ваш метод действительно работает, я подожду некоторое время, чтобы посмотреть, есть ли лучший ответ, если нет, я приму ваш. Спасибо!!

hades 10.12.2018 04:22

Думаю, вы перепутали два метода:

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!");

Другие вопросы по теме