Actualmente estoy trabajando en algunas web dev proyecto en Java, he implementado un frontcontroller, que el trabajo es instanciar nuevos controladores, dependiendo de la ruta.

Así que cuando el usuario está ejecutando ?q=user/login ex. el controlador frontal debe instatiate la UserController, que estoy tratando de hacer con este trozo de código.

    String q = request.getParameter("q");

    try {
        String[] page = q.split("/");
        //Make first char upper, to match class name conventions.
        page[0] = (page[0].substring(0, 1).toUpperCase() + page[0].substring(1).toLowerCase()).trim();

      Class contDes = Class.forName("dk.elvar.rocks." + page[0]+ "Controller");
      Constructor co = contDes.getConstructor();
      co.newInstance(request, response, page);

Esto se traduce en una

java.lang.NoSuchMethodException: dk.elvar.rocks.UserController.<init>()
at java.lang.Class.getConstructor0(Class.java:2706)
at java.lang.Class.getConstructor(Class.java:1657)
at dk.elvar.rocks.FrontController.doGet(FrontController.java:35)

He probado a buscar en google, y errores como, declarar un constructor de objeto cargado, hacer que el público de clase, ya está ahí.

UserController:

public class UserController extends HttpServlet  {

private final String USERNAME = "Martin";
private final String PASSWORD = "David";

    private static final long serialVersionUID = 1L;
HttpServletRequest request;  
HttpServletResponse response;

public UserController(HttpServletRequest request, HttpServletResponse response, String[] action)  {
    this.request = request;
    this.response = response;

    if(action[1].equalsIgnoreCase("login")) {
        this.renderLoginAction();
    }
    if(action[1].equalsIgnoreCase("val-login")) {
        this.validateLoginAction();
    }
}
InformationsquelleAutor MartinElvar | 2012-09-13

2 Comentarios

  1. 14

    Que, probablemente, obtener esta excepción debido a que la clase no tiene un constructor predeterminado. Usted puede obtener un constructor con parámetros pasándolos a la getConstructor método:

    Constructor co = contDes.getConstructor(
                    HttpServletRequest.class, 
                    HttpServletResponse.class, 
                    String[].class);
    co.newInstance(request, response, page);
    • Muchas gracias, este funciona a la perfección! Sin embargo, yo no entiendo lo que quieres decir con un constructor por defecto? Hice definir un constructor en UserController, ¿cómo puedo definir como predeterminado?
    • Elvar Jensen Un constructor sin parámetros es un constructor predeterminado.Todas las clases de java por defecto tiene un valor predeterminado costructor, pero cuando se define un nuevo constructor con algunos parámetros se pierde el constructor predeterminado implícito.
    • Gracias @basiljames ahora entiendo por completo 🙂
  2. 0

    Generalmente no se recomienda el uso de otro constructor predeterminado, como web.xml o struts-config.xml se utiliza para crear una instancia del servlet mediante la reflexión.

    Si quieres conseguir instancia de la otra clase de constructor predeterminado,

    Class userController = Class.forName("<packages.>UserController");
    Constructor userControllerConstructor = userController.class.getConstructor(HttpServletRequest.class, HttpServletResponse.class, String[].class);
    UserController userControllerObj = (UserController)constructor.newInstance(request,response, action);

Dejar respuesta

Please enter your comment!
Please enter your name here