gpt4 book ai didi

java - Spring mvc :annotation-driven 问题

转载 作者:搜寻专家 更新时间:2023-11-01 02:19:07 25 4
gpt4 key购买 nike

我有一个像这样的 Controller

@RequestMapping(value = {TABLE_URL}, method = RequestMethod.POST)
@ResponseBody
public TableModel checkAvailability(@ModelAttribute TableQueryForm TableQueryForm,
TableContext table, BindingResult bindingResult) throws Exception {
// body
}

这里的 TableContext 是一个接口(interface),它有一个实现并且工作正常。

最近我需要添加一个自定义日期格式化程序,所以在添加它以启用它之后我添加了行

<mvc:annotation-driven conversion-service="conversionService"/>

如前所述here

现在添加后,我的请求因以下异常而失败

Wrapped by: java.lang.IllegalStateException: No primary or default constructor found for interface com.table.domain.search.TableContext
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:212)
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:84)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:132)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:124)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:131)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

此类的实现没有定义构造函数,因此默认情况下应该激活默认构造函数。我不知道为什么会这样。请帮我解决这个问题。

最佳答案

如果不提供适当的 HandlerMethodArgumentResolver,则无法在 spring 处理程序中注入(inject)自定义 java 接口(interface).请注意“自定义”一词,因为 Spring 可以注入(inject)其他接口(interface)的实现,如 HttpServletRequest、HttpServletResponse、Reader、Writer 等。在这些情况下,Spring 会注入(inject)适当的具体实现。对于自定义 java 类(如果它只是接口(interface)),这不可能的原因可以从您得到的错误堆栈跟踪中看出。如果您的接口(interface)没有自定义处理程序解析器,则解析逻辑会回退到默认的 ModelAttributeMethodProcessor 上,它会尝试在所有情况下为所提到的接口(interface)类找到构造函数,但是由于在 java 中,接口(interface)不能有构造函数,因此失败(请注意带有 FAILS 的行这里)

public class ModelAttributeMethodProcessor {

protected Object createAttribute(String attributeName, MethodParameter parameter,
WebDataBinderFactory binderFactory, NativeWebRequest webRequest) throws Exception {

MethodParameter nestedParameter = parameter.nestedIfOptional();
Class<?> clazz = nestedParameter.getNestedParameterType();

Constructor<?> ctor = BeanUtils.findPrimaryConstructor(clazz);
if (ctor == null) {
Constructor<?>[] ctors = clazz.getConstructors();
if (ctors.length == 1) {
ctor = ctors[0];
}
else {
try {
ctor = clazz.getDeclaredConstructor(); // FAILS HERE
}
catch (NoSuchMethodException ex) {
throw new IllegalStateException("No primary or default constructor found for " + clazz, ex);
}
}
}
......................................
......................................

我尝试了以下测试类(class)

public interface TestInterface {    
public void test() ;
}

@Component
public class TestInterfaceImpl implements TestInterface {

@Override
public void test() {
System.out.println("Test called");
}

}

如果我的测试 Controller 是

 @RestController
@RequestMapping("/test")
public class TestController {

@GetMapping("test")
public String withParam(TestInterface testInterface) {
return "test";
}

我遇到了和你一样的错误

Caused by: java.lang.IllegalStateException: No primary or default constructor found for interface com.shailendra.TestInterface
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:212)
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:84)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:132)

但是如果我在下面使用

@RestController
@RequestMapping("/test")
public class TestController {

@GetMapping("test")
public String withParam(TestInterfaceImpl test) {
return "test";
}

我得到了正确的回应。

如果接口(interface)注入(inject)有效,那么看起来你之前配置了一个合适的 HandlerMethodArgumentResolver,但不知何故,由于你的更改,现在它没有被拾取(可能是因为配置被排除在 spring 扫描之外)

关于java - Spring mvc :annotation-driven 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55061837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com