没有为接口 com.example.demo.models.IPerson 找到主构造函数或单个唯一构造函数

Posted

技术标签:

【中文标题】没有为接口 com.example.demo.models.IPerson 找到主构造函数或单个唯一构造函数【英文标题】:No primary or single unique constructor found for interface com.example.demo.models.IPerson 【发布时间】:2022-01-18 18:35:52 【问题描述】:

我正在尝试调用我的后端并设置了一个像这样的简单控制器。

@RestController
public class HelloController 

    @RequestMapping("/hello")
    public String Hello(IPerson person) 
        return person.sayHello();
    

IPerson是一个接口如下

package com.example.demo.models;

public interface IPerson 

    default String sayHello() 
        return "Hey There";
    


我已经将接口实现为

package com.example.demo.models;

import lombok.Builder;

@Builder
public class Person implements IPerson

    String name;
    String age;


当我将控制器中的参数更改为接口的实现时,调用有效,即

@RestController
public class HelloController 

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

使用 IPerson 作为参数调用函数时,出现以下错误。

java.lang.IllegalStateException: No primary or single unique constructor found for interface 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]

我认为可能发生的情况是它需要一个 IPerson 的实现,但无法找到一个,但我不确定这种调用是否可能,如果它是我可能缺少的配置。

【问题讨论】:

Spring使用反射创建实例,不能创建接口实例。 Spring应该如何知道你的接口的哪个实现应该被实例化?如果你不以某种方式指导它,它就不会神奇地发生。您应该通过使用适当的注释注释您的类来指导它 知道了,设计接口无法实例化,因此当请求到达后端时,它无法为此 IPerson 接口创建实例,但可以为其实现 Person。 【参考方案1】:

Spring 使用反射在请求处理方法中实例化模型属性。它将尝试找到一个默认构造函数并调用它。

根据 Java 的设计,您不能创建接口的实例(也不能创建抽象类),而只能创建具体的类。因此,您的 IPerson 将失败,因为这是一个接口,而您的 Person 将成功,因为这是一个带有构造函数的类。

所以简而言之,您不能使用接口将变量绑定到模型对象,只能使用具体类。

【讨论】:

【参考方案2】:

尝试将@RequestBody 注解添加到参数中。另外,我建议将 RequestMapping 更改为 PostMapping

例子

  @PostMapping("/hello")
    public String Hello(@RequestBody Person person) 
        return person.sayHello();
    

【讨论】:

@RestController 已经添加了与@RequestBody 相同的行为。

以上是关于没有为接口 com.example.demo.models.IPerson 找到主构造函数或单个唯一构造函数的主要内容,如果未能解决你的问题,请参考以下文章

Graphql没有为接口/联合定义解析器 - java

Swift Network.framework:为没有 IP 连接的以太网接口获取 NWInterface

// 如果(翻页的时候页面没有数据的话) 接口返回的数组长度为0的时候 直接阻止

没有为接口 com.example.demo.models.IPerson 找到主构造函数或单个唯一构造函数

YOURLS 将“缩短”接口设为私有

如何在 swig & python 中为没有默认构造函数的 std::pair<> 创建接口?