Получить неверный пользовательский ввод с ошибкой Spring typeMismatch - PullRequest
2 голосов
/ 06 мая 2010

Я реализовал ReloadableResourceBundleMessageSource в своем приложении Spring MVC, которое я использую для отображения более красивых сообщений об ошибках для исключений привязки. У меня проблема в том, что из-за политики компании эти ошибки должны отображаться в следующем формате:

[inputData] не является допустимым [fieldName].

Имя поля доступно по умолчанию в моем файле свойств сообщения (как аргумент {0}), но я не могу найти способ отобразить неверный ввод пользователя. Возможно ли это?

1 Ответ

1 голос
/ 09 мая 2010

Да,

error Tag не позволяет получить «значение», предоставленное вашим пользователем - см. ссылку

Предположим, здесь идет ваш файл errors.properties (корень пути к классам) (обратите внимание, я использую только один аргумент {0})

// errors.properties

error.invalid=is not a valid {0}

При проверке вашего командного объекта вы делаете следующее

import static org.springframework.validation.ValidationUtils.*;

public boolean validate(Object command, Errors errors) {

    Person person = (Person) command;

    /**
      * new Object [] plays the role of the supplied arguments
      */
    rejectIfEmpty(errors, "age", "error.invalid", new Object[] {"Age"}, "Age is required");

    /**
      * If your label is a resource bundle key, use DefaultMessageSourceResolvable instead
      *
      * rejectIfEmpty(errors, "age", "error.invalid", new Object[] {new DefaultMessageSourceResolvable("person.age")}, "Age is required");
      */

}

UPDATE

Но для достижения цели вы должны предоставить собственный источник сообщений ( Уведомление реализует вместо extends )

public class PolicyMessageSource implements MessageSource {

    private ResourceBundleMessageSource resourceBundle;

    public PolicyMessageSource() {
        resourceBundle = new ResourceBundleMessageSource();

        /**
          * Suppose your resource bundle is called messages.properties (root of the classpath)
          */
        resourceBundle.setBasenames(new String[] {"messages"});
    }

    public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
        return resourceBundle.getMessage(code, args, defaultMessage, locale);
    }

    public String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException {
        return resourceBundle.getMessage(code, args, locale);
    }

    public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException {
        if(resolvable instanceof FieldError) {
            FieldError fieldError = (FieldError) resolvable;

            /**
              * Here goes what you want
              */
            return fieldError.getRejectedValue() + resourceBundle.getMessage(resolvable, locale);
        }

        return resourceBundle.getMessage(resolvable, locale);
    }

}

Итак, определите ваш PolicyMessageSource как messageSource

<bean id="messageSource" class="br.com.spring.PolicyMessageSource"/>

Помните, что вы должны определить только один экземпляр messageSource с именем messageSource . Обратите внимание, что вместо этого я использую ResourceBundleMessageSource . Вы должны проверить тот же подход при использовании ReloadableResourceBundleMessageSource . Имейте это в виду.

...