Validação da mola, como fazer com que o PropertyEditor gere uma mensagem de erro específica

Estou usando o Spring para entrada e validação de formulário. O comando do controlador de formulário contém o modelo que está sendo editado. Alguns dos atributos do modelo são um tipo personalizado. Por exemplo, o número de previdência social da Pessoa é um tipo de SSN personalizad

public class Person {
    public String getName() {...}
    public void setName(String name) {...}
    public SSN getSocialSecurtyNumber() {...}
    public void setSocialSecurtyNumber(SSN ssn) {...}
}

and wrapping Pessoa em um comando de edição de formulário Spring:

public class EditPersonCommand {
    public Person getPerson() {...}
    public void setPerson(Person person) {...}
}

Como o Spring não sabe converter texto em um SSN, registro um editor de cliente com o fichário do controlador de formulário:

public class EditPersonController extends SimpleFormController {
    protected void initBinder(HttpServletRequest req, ServletRequestDataBinder binder) {
        super.initBinder(req, binder);
        binder.registerCustomEditor(SSN.class, "person.ssn", new SsnEditor());
    }
}

e SsnEditor é apenas um @ personalizajava.beans.PropertyEditor que pode converter texto em um objeto 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
    }
}

E sesetAsText encontra texto inválido e não pode ser convertido em um SSN; em seguida, ele lançaIllegalArgumentException (porPropertyEditor setAsText). O problema que estou enfrentando é que a conversão de texto em objeto (viaPropertyEditor.setAsText()) acontece emante meu validador Spring é chamado. QuandosetAsText jogaIllegalArgumentException, O Spring simplesmente exibe a mensagem de erro genérica definida emerrors.properties. O que eu quero é uma mensagem de erro específica que dependa do motivo exato pelo qual o SSN inserido é inválido.PropertyEditor.setAsText() determinaria o motivo. Tentei incorporar o texto do motivo do erro emIllegalArgumentException, mas o Spring o trata apenas como um erro genéric

Existe uma solução para isso? Para repetir, o que eu quero é a mensagem de erro específica gerada peloPropertyEditor para aparecer na mensagem de erro no formulário Spring. A única alternativa em que posso pensar é armazenar o SSN como texto no comando e executar a validação no validador. A conversão de texto em objeto SSN ocorreria no formatoonSubmit. Isso é menos desejável, pois meu formulário (e modelo) tem muitas propriedades e não quero criar e manter um comando que tenha todos os atributos de modelo como um campo de text

O exemplo acima é apenas um exemplo, meu código real não é Person / SSN; portanto, não há necessidade de responder com "por que não armazenar o SSN como texto ..."

questionAnswers(5)

yourAnswerToTheQuestion