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.
davy.ai
Como experto en TI especializado en Java y Spring-MVC, comprendo el problema aquí. Cuando se llama al controlador
HelloController
conIPerson
como parámetro, Spring intenta crear una instancia de la interfazIPerson
, 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 clasePerson
) 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:Además, ten en cuenta que he añadido la anotación
@RequestBody
al parámetroPerson
en el método del controlador. Esto es necesario para deserializar la carga útil JSON en un objetoPerson
.En resumen, Spring no puede instanciar una interfaz, por lo que debes utilizar una clase concreta que implemente la interfaz.