【问题标题】:Spring MVC Maps in @PathVaribale not works@PathVaribale 中的 Spring MVC 映射不起作用
【发布时间】:2016-01-31 16:18:02
【问题描述】:

我是 Spring MVC 的初学者。我实现了一个小型 Web 应用程序来从 URL 中获取国家和用户名并显示它。

这是我的 mvc-disptcher-servlet.xml 文件

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:mvc="http://www.springframework.org/schema/cache"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

<context:component-scan base-package="com.springapp.mvc"/>
<mvc:annotation-driven/>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

这是我的 HelloController.java 文件

package com.springapp.mvc;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import java.util.Map;

@Controller
class HelloController{

    @RequestMapping("/") //if url comes with '/' calls following method (RequestMapping annotation decides which have to do)

    public ModelAndView printWelcome() {
        ModelAndView model = new ModelAndView("hello"); // sends to the "hello.jsp"
        model.addObject("message", "Hello world!"); // including to display (identify by message tag)
        return model;
    }

    @RequestMapping("/{CountryName}/{UserName}") //if url comes with '("/{CountryName}/{UserName}'

    public ModelAndView printfirst(@PathVariable Map<String,String> pathvalues) {

        String username = pathvalues.get("UserName");
        String country = pathvalues.get("CountryName");

        ModelAndView model = new ModelAndView("first"); // sends to the "first.jsp"

        model.addObject("usrnm" , username); // includings to display 
        model.addObject("cntry" , country);

        return model;
    }
}

这是我的第一个.jsp 文件

<%--
  Created by IntelliJ IDEA.
  User: dilanka
  Date: 10/31/15
  Time: 1:27 AM
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>

<body>
    <h1>Welcome to the SPRING World</h1>
    <br>
    <h2>hello ${usrnm}</h2>
    <br>
    <h3>you logged from ${cntry}</h3>
</body>
</html>

请任何人都可以帮我找出这个错误。运行时报错...

错误是...

Apache Tomcat/7.0.65 - 错误报告

HTTP 状态 500 - servlet mvc-dispatcher 的 Servlet.init() 抛出异常

类型异常报告

消息 Servlet mvc-dispatcher 的 Servlet.init() 抛出异常

描述服务器遇到了一个内部错误,导致它无法完成这个请求。

异常

javax.servlet.ServletException: Servlet mvc-dispatcher 的 Servlet.init() 抛出异常
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    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)

根本原因

org.springframework.beans.factory.BeanCreationException:创建名为“org.springframework.cache.interceptor.CacheInterceptor#0”的bean时出错:设置bean属性“cacheManager”时无法解析对bean“cacheManager”的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'cacheManager' is defined
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:336)
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1471)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1216)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:725)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:629)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:677)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:548)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    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)

根本原因

org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为“cacheManager”的bean
    org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:660)
    org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1157)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:280)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1471)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1216)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:725)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:629)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:677)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:548)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    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)

note Apache Tomcat/7.0.65 日志中提供了根本原因的完整堆栈跟踪。

Apache Tomcat/7.0.65

【问题讨论】:

  • 你用什么 URL 测试它?结果如何?
  • 什么错误?
  • @DilankaRathnayake 请使用整个堆栈跟踪更新您的帖子。
  • 尝试使用这种方法:@PathVariable("CountryName", "UserName") Map pathvalues
  • url 是 localhost:8080/srilanka/dilaka 错误是 == HTTP Status 500 - Servlet.init() for servlet mvc-dispatcher throw exception

标签: java spring spring-mvc jakarta-ee web-applications


【解决方案1】:

首先确保您的容器(tomcat、jetty 等)正在运行,并且您已将 webapp 部署到其中。默认的 tomcat 端口是 8080,所以链接看起来像 localhost:8080/{appName}/ 如果你使用spring boot(可能你没有,因为它的默认配置是Java配置)那么你可以跳过appName

你的控制器方法注解看起来不错,参数应该绑定到你的地图

其次,你的 *.jsp 应该在 webapp/WEB-INF/pages 文件夹中

编辑: 您可以添加错误的堆栈跟踪吗?看起来问题出在其他地方

编辑2:

好的,问题是你的配置由 IntelliJ 引起的

您已经声明了 mvc 命名空间,但 IntelliJ 以某种方式将架构 mvc 命名空间交换为缓存命名空间 url

xmlns:mvc="http://www.springframework.org/schema/cache"

这里

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org /schema/context/spring-context.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">

要解决此问题,您必须删除 spring-cache 和缓存 url。

正确的配置应该是这样的:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.springapp.mvc" />
    <mvc:annotation-driven></mvc:annotation-driven>
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".jsp" />
    </bean>

</beans>

此外,您可以使用两种@PathVariable 方法实现: 1) @PathVariable 作为两个单独的参数 2) @PathVariable 作为地图

【讨论】:

  • 我也添加了错误,当我从 mvc-dispatcher-servlet.xml 中删除 并将地图替换为 '@PathVariable("UserName") String usr , @ PathVariable("CountryName") String cntr' 应用程序运行正常.. 当我将代码 插入到 mvc-dispatcher-servlet.xml 时出现错误
  • 它与你的注解或你实现@PathVariable方法的方式无关,查看我的答案修复它,记得保留
  • 我试过了。我用你的代码替换了我的代码。但仍然得到错误。所以我上传了我的整个项目。请好心检查一下..在这里..dropbox.com/s/z3iz8d3vrpvy00n/hello.zip?dl=0
  • @DilankaRathnayake 抱歉,因为我是手写的,所以我打错字了,现在尝试配置 ;)
  • @DilankaRathnayake 我刚刚运行了这个项目并且它工作正常,尝试再次复制粘贴配置,而不是重写它;)
猜你喜欢
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2014-06-12
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多