Kotlin NoClassDefFoundError和spring @RequestMapping方法

我试图用Kotlin + IntelliJ来学习一些spring的基础知识,而且我遇到了一些麻烦。 @RequestMapping带注释的方法(带参数)会导致exception,而Java等价物完全正常。 Kotlin代码工作正常,但只有没有“processFormTwo”方法(将工作Java代码转换为kotlin也无济于事)。

这里是代码:

@Controller class HelloWorldController { @RequestMapping("/showForm") fun showForm() = "helloworld-form" // this one works fine @RequestMapping("/processForm") fun processForm() = "helloworld" //this one doesn't @RequestMapping("/processFormTwo") fun processFormTwo(request: HttpServletRequest, model: Model): String { var theName = request.getParameter("studentName") theName = theName.toUpperCase() val result = "Yo! " + theName model.addAttribute("message", result) return "helloworld" } } 

组态:

             

web.xml中

   spring-mvc-demo    dispatcher org.springframework.web.servlet.DispatcherServlet  contextConfigLocation /WEB-INF/spring-mvc-demo-servlet.xml  1    dispatcher /   

错误日志:

例外

javax.servlet.ServletException:Servlet.init()为servlet调度器抛出exceptionorg.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 79)org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)org.apache.coyote.http11.AbstractHttp11Processor.process( AbstractHttp11Processor.java:1132)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:684)org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.doRun(AprEndpoint.java:2521)org.apache。 tomcat.util.net.AprEndpoint $ SocketProcessor.run(AprEndpoint.java:2510)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java: 617)org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThr ead.java:61)java.lang.Thread.run(Thread.java:745)根本原因

org.springframework.beans.factory.BeanCreationException:创建名为“helloWorldController”的bean时出错:无法为查找方法元数据内省bean类[com.luv2code.springdemo.mvc.HelloWorldController]:找不到依赖的类; 嵌套exception是java.lang.NoClassDefFoundError:科特林/ TypeCastException org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:269)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java: 1118)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1091)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)org.springframework.beans.factory。 (AbstractAutowireCapableBeanFactory.java:483)org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306)org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleto (DefaultSingletonBeanRegistry.java:230)org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)org。 springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext。 java:543)org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668)org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634)org.springframework.web.servlet.FrameworkServlet。 createWebApplicationContext(FrameworkServlet.java:682)org.springframework.web.servlet.FrameworkServlet.initWebAppli (ContextServlet.java:553)org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494)org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:171)javax.servlet.GenericServlet。 init(GenericServlet.java:158)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)org.apache.catalina。 (AbstractAccessLogValve.java:620)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)org。 apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:684)org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.doRun(AprEndpoint.java:2521)org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.run(AprEndpoint.java:2510)java.util.concurrent.ThreadPoolExecutor.runWo rker(ThreadPoolExecutor.java:1142)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)java。 lang.Thread.run(Thread.java:745)的根本原因

java.lang.NoClassDefFoundError:java.lang.Class.getDeclaredMethodsO(Native Method) springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:613)org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:524)org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:510)org.springframework。 beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:247)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1118)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance( AbstractAutowireCapableBeanFactory.java:1091)org.springframework.beans.factory.support.AbstractAutowireCapabl eBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306 )org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)org.springframework.beans.factory.support .AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)org.springframework.beans.factory.support .springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:5 43)org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668)org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634)org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext( FrameworkServlet.java:682)org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553)org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494)org.springframework.web.servlet。 HttpServletBean.init(HttpServletBean.java:171)javax.servlet.GenericServlet.init(GenericServlet.java:158)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)org.apache.catalina.valves。 ErrorReportValve.invoke(ErrorReportValve.java:79)org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)org.apach e.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:684)org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.doRun( AprEndpoint.java:2521)org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.run(AprEndpoint.java:2510)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)java.util.concurrent。 ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)java.lang.Thread.run(Thread.java:745)根本原因

java.lang.ClassNotFoundException:kotlin.TypeCastException org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)java.lang.Class .getDeclaredMethods0(Native Method)java.lang.Class.privateGetDeclaredMethods(Class.java:2701)java.lang.Class.getDeclaredMethods(Class.java:1975)org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:613) org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:524)org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:510)org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java: 247)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessor(AbstractAutowireCapableBeanFactory.java:1118)org.springframework。 (AbstractAutowireCapableBeanFactory.java:513)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:1091)org.springframework.beans.factory.support AbstractAutowireCapableBeanFactory.java:483)org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306)org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)org.springframework .beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:761)org.springframework.context.support.AbstractApplic ationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668)org.springframework。 web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634)org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682)org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553) org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494)org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:171)javax.servlet.GenericServlet.init(GenericServlet.java:158) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValv e.java:79)org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)org.apache.coyote.http11。 AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:684)org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.doRun(AprEndpoint.java:2521) org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.run(AprEndpoint.java:2510)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)java.util.concurrent.ThreadPoolExecutor $ Worker.run( ThreadPoolExecutor.java:617)org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)java.lang.Thread.run(Thread.java:745)

尝试将Controller类和函数都标记为open

有一个gradle插件可以将所有的类标记为open:

 buildscript{ dependencies { classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlinVersion") } } apply plugin: 'kotlin-spring'