Я использую Spring для ввода и проверки формы. Команда контроллера формы содержит редактируемую модель. Некоторые атрибуты модели являются пользовательским типом. Например, номер социального страхования лица - это пользовательский тип SSN.
public class Person {
public String getName() {...}
public void setName(String name) {...}
public SSN getSocialSecurtyNumber() {...}
public void setSocialSecurtyNumber(SSN ssn) {...}
}
и обтекание Person в команде редактирования формы Spring:
public class EditPersonCommand {
public Person getPerson() {...}
public void setPerson(Person person) {...}
}
Поскольку Spring не знает, как преобразовать текст в SSN, я регистрирую редактор клиента с помощью связывателя контроллера формы:
public class EditPersonController extends SimpleFormController {
protected void initBinder(HttpServletRequest req, ServletRequestDataBinder binder) {
super.initBinder(req, binder);
binder.registerCustomEditor(SSN.class, "person.ssn", new SsnEditor());
}
}
и SsnEditor - это просто пользовательский java.beans.PropertyEditor
, который может преобразовывать текст в объект SSN:
public class SsnEditor extends PropertyEditorSupport {
public String getAsText() {...} // converts SSN to text
public void setAsText(String str) {
// converts text to SSN
// throws IllegalArgumentException for invalid text
}
}
Если setAsText
встречает текст, который является недопустимым и не может быть преобразован в SSN, он выбрасывает IllegalArgumentException
(согласно спецификации PropertyEditor
setAsText
). У меня проблема в том, что преобразование текста в объект (через PropertyEditor.setAsText()
) происходит до того, как вызовет мой валидатор Spring. Когда setAsText
выдает IllegalArgumentException
, Spring просто отображает общее сообщение об ошибке, определенное в errors.properties
. Что я хочу, это конкретное сообщение об ошибке, которое зависит от точной причины, почему введенный SSN является недействительным. PropertyEditor.setAsText()
определит причину. Я пытался встроить текст причины ошибки в текст IllegalArgumentException
, но Spring просто воспринимает его как общую ошибку.
Есть ли решение для этого? Повторим, что мне нужно конкретное сообщение об ошибке, сгенерированное PropertyEditor
для отображения сообщения об ошибке в форме Spring. Единственная альтернатива, о которой я могу подумать, - это сохранить SSN как текст в команде и выполнить проверку в валидаторе. Преобразование текста в объект SSN будет иметь место в форме onSubmit
. Это менее желательно, поскольку моя форма (и модель) имеет много свойств, и мне не нужно создавать и поддерживать команду, в которой каждый атрибут модели представлен в виде текстового поля.
Выше приведен только пример, мой настоящий код не Person / SSN, поэтому нет необходимости отвечать «почему бы не сохранить SSN в виде текста ...»