Używam Spring do wprowadzania formularzy i sprawdzania poprawności. Polecenie kontrolera formularza zawiera model, który jest edytowany. Niektóre atrybuty modelu są niestandardowe. Na przykład osobisty numer ubezpieczenia społecznego to niestandardowy typ SSN.Sprawdzanie poprawności sprężyny, jak wygenerować specyficzny komunikat o błędzie przez narzędzie Property Agent
public class Person {
public String getName() {...}
public void setName(String name) {...}
public SSN getSocialSecurtyNumber() {...}
public void setSocialSecurtyNumber(SSN ssn) {...}
}
i owijania Osoba w poleceniu forma Wiosna EDIT:
public class EditPersonCommand {
public Person getPerson() {...}
public void setPerson(Person person) {...}
}
Od wiosny nie wie, jak do konwersji tekstu do SSN, zarejestrować edytora klienta ze spoiwem sterownika forma za:
public class EditPersonController extends SimpleFormController {
protected void initBinder(HttpServletRequest req, ServletRequestDataBinder binder) {
super.initBinder(req, binder);
binder.registerCustomEditor(SSN.class, "person.ssn", new SsnEditor());
}
}
i SsnEditor jest po prostu zwyczaj java.beans.PropertyEditor
który może konwertować tekst do obiektu 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
}
}
Jeśli setAsText
spotkania tekst jest nieważny i nie może być przekształcony w SSN, a następnie generuje IllegalArgumentException
(na PropertyEditor
setAsText
jest specyfikacja). Problem mam jest to, że tekst do obiektu konwersji (poprzez PropertyEditor.setAsText()
) odbywa przed moja Wiosna walidator jest tzw. Gdy setAsText
rzuca IllegalArgumentException
, Spring po prostu wyświetla ogólny komunikat o błędzie zdefiniowany w errors.properties
. Potrzebuję konkretnego komunikatu o błędzie, który zależy od dokładnego powodu, dla którego wprowadzony numer SSN jest nieprawidłowy. PropertyEditor.setAsText()
określałby przyczynę. Próbowałem umieścić tekst przyczyny błędu w tekście IllegalArgumentException
, ale Spring traktuje to jako ogólny błąd.
Czy istnieje rozwiązanie tego problemu? Aby powtórzyć, potrzebuję konkretnego komunikatu o błędzie wygenerowanego przez PropertyEditor
w celu wypłynięcia na komunikat o błędzie w formularzu Spring. Jedyną alternatywą, o której mogę pomyśleć, to przechowywanie SSN jako tekstu w komendzie i sprawdzenie poprawności w walidatorze. Konwersja tekstu na obiekt SSN będzie miała postać onSubmit
. Jest to mniej pożądane, ponieważ moja forma (i model) ma wiele właściwości i nie chcę tworzyć i utrzymywać polecenia, które mają każdy atrybut modelu jako pole tekstowe.
Powyższe to tylko przykład, mój kod nie jest rzeczywista Osoba/SSN, więc nie ma potrzeby, aby odpowiedzieć „dlaczego nie przechowuje SSN jako tekst ...”
@Steve Kuo Dodałem do oryginalnej odpowiedzi –