Spring - отключает, связывают исключения (для особого свойства)

В веб-приложении я работаю над использованием Spring 2.5.6. SEC01, у меня по существу есть поле Integer, которое берет число для определения который страница прокрутить к. Требования изменились, и мы больше не хотим отобразить сообщение об ошибке, но просто проигнорировать вход пользователя, если они вводят неверный номер, говорят "adfadf".

Я читал, что можно сделать это через:

TypeMismatch.property=Some новое сообщение об ошибке

Однако попробовав это, мы все еще получаем исходное сообщение об ошибке: java.lang. Целое число. TypeMismatch =...

Я только хочу отключить это сообщение для того данного свойства. Как я могу сделать это? Я все еще хочу связать для появления автоматически, я просто не хочу слышать об этом теперь.

Walter

5
задан 14 May 2010 в 14:46
поделиться

3 ответа

Согласно DefaultMessageCodesResolver

В случае кода «typeMismatch», имя объекта «user», поле «age»

  • typeMismatch.user.age
  • typeMismatch.age
  • typeMismatch.int
  • typeMismatch

Итак, вы должны получить (я полагаю, ваше commandName называется command , а ваше свойство - age ) Адаптировать в соответствии с вашим кодом

typeMismatch.command.age
typeMismatch.age
typeMismatch.java.lang.Integer
typeMismatch

Обратите внимание Третий код

typeMismatch.java.lang.Integer

Он решит то, что вы хотите

ОБНОВЛЕНИЕ

Я создал класс команды Person

public class Person implements Serializable {

    private Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

}

И контроллер человека

public class PersonController extends SimpleFormController {

    public PersonController() {
        setCommandClass(Person.class);
        setValidator(new Validator() {
            public boolean supports(Class clazz) {
                return clazz.isAssignableFrom(Person.class);
            }

            public void validate(Object command, Errors errors) {
                rejectIfEmpty(errors, "age", "Age is required");
            }
        });
    }

    @Override
    protected ModelAndView onSubmit(Object command) throws Exception {
        return new ModelAndView();
    }

}    

Вот мой myMessages.properties (корень пути к классам)

typeMismatch.command.age=typeMismatch.command.age
typeMismatch.age=typeMismatch.age
typeMismatch.java.lang.Integer=typeMismatch.java.lang.Integer
typeMismatch=typeMismatch

Итак, я выполнили следующий тест

public class PersonControllerTest {

    private PersonController personController;
    private MockHttpServletRequest request;

    private MessageSource messageSource;

    @Before
    public void setUp() {
        request = new MockHttpServletRequest();
        request.setMethod("POST");

        personController = new PersonController();

        messageSource = new ResourceBundleMessageSource();
        ((ResourceBundleMessageSource) messageSource).setBasename("myMessages");
    }

    @Test
    public void failureSubmission() throws Exception {
        /**
         * Ops... a bindException
         * 
         * Age can not be a plain String, It must be a plain Integer
         */
        request.addParameter("age", "not a meaningful age");

        ModelAndView mav = personController.handleRequest(request, new MockHttpServletResponse());

        BindingResult bindException = (BindingResult) mav.getModel().get(BindingResult.MODEL_KEY_PREFIX + "command");
        for (Object object : bindException.getAllErrors()) {
            if(object instanceof FieldError) {
                FieldError fieldError = (FieldError) object;

                assertEquals(fieldError.getField(), "age");

                /**
                  * outputs typeMismatch.command.age
                  */
                System.out.println(messageSource.getMessage((FieldError) object, null));
            }
        }
    }

}

Если вам нужен второй, вы должны избавиться от пакета ресурсов ключа typeMismatch.command.age

typeMismatch.age=typeMismatch.age
typeMismatch.java.lang.Integer=typeMismatch.java.lang.Integer
typeMismatch=typeMismatch

Или написать свою собственную реализацию MessageCodesResolver

public class MyCustomMessageCodesResolver implements MessageCodesResolver {

    private DefaultMessageCodesResolver defaultMessageCodesResolver = new DefaultMessageCodesResolver();

    public String [] resolveMessageCodes(String errorCode, String objectName) {
        if(errorCode.equals("age"))
            /**
              * Set up your custom message right here
              */
            return new String[] {"typeMismatch.age"};

        return defaultMessageCodesResolver.resolveMessageCodes(String errorCode, String objectName);
    }

    public void String[] resolveMessageCodes(String errorCode, String objectName, String field, Class fieldType) {
        if(errorCode.equals("age"))
            /**
              * Set up your custom message right here
              */
            return new String[] {"typeMismatch.age"};

        return defaultMessageCodesResolver.resolveMessageCodes(String errorCode, String objectName, String field, Class fieldType);
    }
}

и настроить ваш PersonController

public class PersonController extends SimpleFormController {

    public PersonController() {
        setMessageCodesResolver(new MyCustomMessageCodesResolver());
        setCommandClass(Person.class);
        setValidator(new Validator() {
            public boolean supports(Class clazz) {
                return clazz.isAssignableFrom(Person.class);
            }

            public void validate(Object command, Errors errors) {
                rejectIfEmpty(errors, "age", "Age is required");
            }
        });
    }
4
ответ дан 15 December 2019 в 00:53
поделиться

Поскольку это приложение Spring MVC и, если предположить, что это простая форма, вы можете настроить это разными способами. Можете ли вы указать настройки вашего контроллера? Для почтового запроса вы можете записать подавленный поле перед вызовом валидатора (при условии, что вы его указали) или после вызова валидатора. Если вы хотите сделать это до валидации, вы можете вызвать [this] [2]. После валидации вы можете вызвать [this ] [3]

[2]: http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/web/servlet/mvc/BaseCommandContro ller.html # onBind (javax.servlet.http.HttpServletRequest , java.lang.Object, org.springframework.validation.BindException) [3]: http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/web/servlet/mvc/BaseCommandController.html# onBindAndValidate (javax.servlet.http.HttpServletRequest , java.lang.Object, org.springframework.validation.BindException)

0
ответ дан 15 December 2019 в 00:53
поделиться

Вы можете зарегистрировать пользовательский PropertyEditor для этого поля, что не приведет к ошибке при несовпадении типов.

0
ответ дан 15 December 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: