validator validate example custom bean java spring validation hibernate-validator

java - validate - spring custom validator



java.lang.NoSuchMethodException: userAuth.User.<init>() (4)

Tengo la clase con validación:

public class User { @Size(min=3, max=20, message="User name must be between 3 and 20 characters long") @Pattern(regexp="^[a-zA-Z0-9]+$", message="User name must be alphanumeric with no spaces") private String name; @Size(min=6, max=20, message="Password must be between 6 and 20 characters long") @Pattern(regexp="^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$", message="Password must contains at least one number") private String password; public User(String _name, String _password){ super(); name = _name; password = _password; } public String getName(){ return name; } public String getPassword(){ return password; } public void setPassword(String newPassword){ password = newPassword; } }

cuando valido los valores, recibí el mensaje:

SEVERE: Servlet.service() for servlet osAppServlet threw exception java.lang.NoSuchMethodException: userAuth.User.<init>()

¿Dónde está el problema?


Añadir constructor sin parámetros:

public class User { ... public User() {} ... }


Creo que la respuesta de agregar un constructor no-args predeterminado es clara. Sin embargo, uno también debe pensar en la visibilidad de este último constructor. Las respuestas anteriores muestran el uso de un constructor predeterminado no args público . ¿La visibilidad pública es relevante con respecto a la lógica de la clase?

Como cuestión de hecho, Hibernate no requiere un constructor público sin argumentos. Todavía se puede elegir su visibilidad.

Por lo tanto, recomendaría tener mucho cuidado con la visibilidad del constructor (privado / público / protegido / predeterminado). Elige el adecuado. Por ejemplo, si nadie debería poder llamar a este constructor sin args, elija una visibilidad privada como esta:

public class User { ... private User() {} ... }


El mensaje java.lang.NoSuchMethodException: userAuth.User.<init>() significa que alguien intentó llamar a un constructor sin ningún parámetro. Agregar un constructor predeterminado debería resolver este problema:

public class User { public User() { } .. }


Si la clase User es una clase interna no estática de otra clase (por ejemplo, UserAuth), el mensaje podría surgir si se intenta crear una instancia de la clase User antes de crear una instancia de la clase externa. En este caso, el constructor null-arg podría estar allí en el código pero no se encontrará, ya que la clase externa aún no existe. Una solución podría ser extraer la clase interna en una clase independiente, hacerla estática o asegurar que la inicialización de la clase externa ocurra antes que la de la clase interna.