В веб-приложении я работаю над использованием Spring 2.5.6. SEC01, у меня по существу есть поле Integer, которое берет число для определения который страница прокрутить к. Требования изменились, и мы больше не хотим отобразить сообщение об ошибке, но просто проигнорировать вход пользователя, если они вводят неверный номер, говорят "adfadf".
Я читал, что можно сделать это через:
TypeMismatch.property=Some новое сообщение об ошибке
Однако попробовав это, мы все еще получаем исходное сообщение об ошибке: java.lang. Целое число. TypeMismatch =...
Я только хочу отключить это сообщение для того данного свойства. Как я могу сделать это? Я все еще хочу связать для появления автоматически, я просто не хочу слышать об этом теперь.
Walter
Согласно DefaultMessageCodesResolver
В случае кода «typeMismatch», имя объекта «user», поле «age»
Итак, вы должны получить (я полагаю, ваше 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");
}
});
}
Поскольку это приложение 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)
Вы можете зарегистрировать пользовательский PropertyEditor
для этого поля, что не приведет к ошибке при несовпадении типов.