Springboot интерполяция сообщений об ошибках не работает для пользовательского валидатора - PullRequest
0 голосов
/ 06 декабря 2018

Я смешал оба 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");
        }
    }
}

My 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 голосов
/ 10 декабря 2018

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

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!");
0 голосов
/ 07 декабря 2018

Я не уверен, есть ли какой-нибудь простой способ, но в конце концов мне пришлось сделать вот так,

Добавленный ниже компонент,

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 - это компонент, который вы уже определили в системе.Локаль может быть выведена из внешнего интерфейса, а локаль по умолчанию может быть установлена ​​с другой конфигурацией.

MessageSourceAccessor имеет много перегруженных методов, вы также можете напрямую выставить их, если хотите предоставить эти опции.

...