Mad*_*gar 11 java interface spring-mvc
我正在尝试调用我的后端并设置了一个像这样的简单控制器。
@RestController
public class HelloController {
@RequestMapping("/hello")
public String Hello(IPerson person) {
return person.sayHello();
}
}
Run Code Online (Sandbox Code Playgroud)
IPerson是一个接口如下
package com.example.demo.models;
public interface IPerson {
default String sayHello() {
return "Hey There";
}
}
Run Code Online (Sandbox Code Playgroud)
我已经将接口实现为
package com.example.demo.models;
import lombok.Builder;
@Builder
public class Person implements IPerson{
String name;
String age;
}
Run Code Online (Sandbox Code Playgroud)
当我将控制器中的参数更改为接口的实现时,调用起作用,即
@RestController
public class HelloController {
@RequestMapping("/hello")
public String Hello(Person person) {
return person.sayHello();
}
}
Run Code Online (Sandbox Code Playgroud)
在使用 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]
Run Code Online (Sandbox Code Playgroud)
我认为可能发生的情况是它需要 IPerson 的实现,但无法找到它,但我不确定这种调用是否可能,如果是的话,那么我可能会缺少什么配置。
Spring 使用反射来实例化请求处理方法中的模型属性。它将尝试找到一个默认构造函数并调用它。
根据 java 的设计,您不能创建接口(也不能抽象类)的实例,而只能创建具体类的实例。因此,您IPerson将失败,因为这是一个接口,您Person将成功,因为这是一个带有构造函数的类。
简而言之,您不能使用接口将变量绑定到模型对象,只能使用具体类。
| 归档时间: |
|
| 查看次数: |
20111 次 |
| 最近记录: |