Estoy usando Spring para la entrada y validación de formularios. El comando del controlador de formulario contiene el modelo que se está editando. Algunos de los atributos del modelo son un tipo personalizado. Por ejemplo, el número de la seguridad social de la persona es un tipo de SSN personalizado.Validación de primavera, cómo hacer que PropertyEditor genere un mensaje de error específico
public class Person {
public String getName() {...}
public void setName(String name) {...}
public SSN getSocialSecurtyNumber() {...}
public void setSocialSecurtyNumber(SSN ssn) {...}
}
, embalaje Persona en un comando de la primavera de edición:
public class EditPersonCommand {
public Person getPerson() {...}
public void setPerson(Person person) {...}
}
desde la primavera no se sabe cómo convertir texto a un número de seguro social, registro un editor de cliente con la carpeta del controlador de formulario:
public class EditPersonController extends SimpleFormController {
protected void initBinder(HttpServletRequest req, ServletRequestDataBinder binder) {
super.initBinder(req, binder);
binder.registerCustomEditor(SSN.class, "person.ssn", new SsnEditor());
}
}
y SsnEditor es sólo una costumbre java.beans.PropertyEditor
que puede convertir texto a un 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
}
}
Si setAsText
encuentros texto que es válido y no se puede convertir a un SSN, entonces lanza IllegalArgumentException
(por PropertyEditor
setAsText
's especificación). El problema que estoy teniendo es que la conversión de texto a objeto (a través de PropertyEditor.setAsText()
) se lleva a cabo antes de se llama mi validador de Spring. Cuando setAsText
arroja IllegalArgumentException
, Spring simplemente muestra el mensaje de error genérico definido en errors.properties
. Lo que quiero es un mensaje de error específico que depende de la razón exacta por la cual el SSN ingresado no es válido. PropertyEditor.setAsText()
determinaría la razón. Intenté incrustar el texto de la razón de error en el texto de IllegalArgumentException
, pero Spring solo lo trata como un error genérico.
¿Hay alguna solución a esto? Para repetir, lo que quiero es el mensaje de error específico generado por el PropertyEditor
para que aparezca el mensaje de error en el formulario de Spring. La única alternativa que puedo pensar es almacenar el SSN como texto en el comando y realizar la validación en el validador. La conversión de objeto de texto a SSN se llevaría a cabo en el formulario onSubmit
. Esto es menos deseable ya que mi formulario (y modelo) tiene muchas propiedades y no quiero tener que crear y mantener un comando que tenga todos y cada uno de los atributos del modelo como un campo de texto.
Lo anterior es sólo un ejemplo, mi código actual no es persona/SSN, así que no hay necesidad de responder con "¿por qué no almacenar SSN como texto ..."
@Steve Kuo Agregado a la respuesta original –