es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se encontró un constructor principal o único para la interfaz com.example.demo.models.IPerson.

Estaba trabajando en tratar de hacer una llamada a mi backend y he configurado un controlador simple como este.

@RestController
public class HelloController {

IPerson es una interfaz de la siguiente manera:

package com.example.demo.models;

public interface IPerson {

default String sayHello() {
    return "Hola";
}
}

Y he implementado la interfaz de la siguiente manera:

package com.example.demo.models;

import lombok.Builder;

@Builder
public class Person implements IPerson{

String name;
String age;

}

La llamada funciona cuando cambio el parámetro en el controlador a la implementación de la interfaz, es decir:

@RestController
public class HelloController {

@RequestMapping("/hello")
public String Hello(Person person) {
    return person.sayHello();
}
}

Al llamar a la función con IPerson como parámetro, obtengo el siguiente error.

java.lang.IllegalStateException: No se encontró un constructor primario o un constructor único para la interfaz com.example.demo.models.IPerson
    at org.springframework.beans.BeanUtils.getResolvableConstructor(BeanUtils.java:267) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:219) ~[spring-web-5.3.12.jar:5.3.12]
    at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:85) ~[spring-webmvc-5.3.12.jar:5.3.12]
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:147) ~[spring-web-5.3.12.jar:5.3.12]
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.12.jar:5.3.12]
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179) ~[spring-web-5.3.12.jar:5.3.12]

Lo que creo que podría estar sucediendo es que espera una implementación de IPerson pero no puede encontrar una, pero no estoy seguro si este tipo de llamada es posible y, de ser así, qué configuración podría estar faltando.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Java y Spring-MVC, comprendo el problema aquí. Cuando se llama al controlador HelloController con IPerson como parámetro, Spring intenta crear una instancia de la interfaz IPerson, pero falla porque las interfaces no se pueden instanciar.

    Para resolver el problema, puedes crear una clase que implemente la interfaz IPerson (como ya se ha hecho con la clase Person) y utilizarla como parámetro en el método del controlador en lugar de la interfaz en sí misma. Esto se debe a que Spring puede instanciar clases concretas, pero no interfaces.

    Por lo tanto, el código corregido del controlador HelloController sería:

    @RestController
    public class HelloController {
    
        @RequestMapping("/hello")
        public String Hello(@RequestBody Person person) {
            return person.sayHello();
        }
    }
    

    Además, ten en cuenta que he añadido la anotación @RequestBody al parámetro Person en el método del controlador. Esto es necesario para deserializar la carga útil JSON en un objeto Person.

    En resumen, Spring no puede instanciar una interfaz, por lo que debes utilizar una clase concreta que implemente la interfaz.

Comments are closed.