【问题标题】:Spring MVC- Storing and Retrieving @PathVariable Map<String, String>Spring MVC-存储和检索@PathVariable Map<String, String>
【发布时间】:2016-03-10 01:20:30
【问题描述】:

我已经使用了 2 个 PathVariable,而不是单独使用这些,我想将这 2 个 PathVariables 存储到地图中并希望从地图中检索它。

在 Spring MVC 3.1.0 中,这是我的 Controller 类方法:

@Controller
@RequestMapping("/welcome")
public class HelloController {

@RequestMapping(value="/{countryName}/{userName}",method=RequestMethod.GET)
public String getPathVar(@PathVariable Map<String, String> pathVars, Model model) {

    String name = pathVars.get("userName");
    String country = pathVars.get("countryName");

    model.addAttribute("msg", "Welcome " + name+ " to Spring MVC & You are from" + country);
    return "home";
}

我的请求网址是: http://localhost:3030/spring_mvc_demo/welcome/India/ashrumochan123

但是当使用这个 url 发出请求时,我得到 HTTP 状态 400 -
说明:客户端发送的请求语法错误。

当我单独使用这些路径变量时,它工作正常。 这是代码-

@RequestMapping(value="/{countryName}/{userName}", method=RequestMethod.GET)
    public String goHome(@PathVariable("countryName") String countryName,
            @PathVariable("userName") String userName, Model model) {
        model.addAttribute("msg", "Welcome " + userName
                + " to Spring MVC& You are from " + countryName);
        return "home";
    }

请告诉我是否做错了什么?

任何帮助将不胜感激。

【问题讨论】:

  • 我认为您想要做的事情是不可能的。对于初学者,您正在尝试将String 强制转换为Map,这在您的注释和方法签名中命名不一致。为什么不在控制器方法中根据两个参数创建地图?
  • @woemler,感谢您的快速回复,但这是可能的。我看过一些关于这个的视频演示。但对他们使用的 Spring MVC 版本感到困惑。
  • 其实@Ashrumochan 是对的,方法是对的,但还有一些问题,我试过了,对我来说效果很好,请问你用的是什么spring 版本?
  • 来自 Spring 文档:If the method parameter is Map&lt;String, String&gt; or MultiValueMap&lt;String, String&gt; then the map is populated with all path variable names and values. Since: 3.0
  • 我正在使用 Spring 4.2.5.RELEASE,也许你应该检查客户端请求,如果问题仍然存在,请尝试更新你的 spring。

标签: java spring spring-mvc


【解决方案1】:

根据Spring documentation,它从 3.2 版开始就存在了。

对于@PathVariableMap&lt;String,String&gt;,我认为您在Spring servlet 配置中缺少&lt;mvc:annotation-driven/&gt;

<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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
                    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd     
                    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

<mvc:annotation-driven/>
...

我在this link找到了它。

【讨论】:

  • 我正在使用&lt;mvc:annotation-driven/&gt;
  • 你能提供你的 web 和 servlet xml 吗?仅凭此信息无法重现此问题
  • 感谢@Auro Pimentel,以前我使用的是 Spring 3.1.1.RELEASE,现在更新到 Spring 4.1.6.RELEASE,现在它工作正常......
【解决方案2】:

添加后

以下错误仍然存​​在。

2019 年 11 月 22 日上午 12:52:58 org.apache.catalina.core.StandardWrapperValve 调用 严重:servlet [Dispacher] 在路径 [/FirstSpringMVCProject] 的上下文中的 Servlet.service() 引发异常 [请求处理失败;嵌套异常是 org.springframework.web.bind.annotation.support.HandlerMethodInvocationException:无法调用处理程序方法 [public org.springframework.web.servlet.ModelAndView com.gontuseries.controller.HelloController.helloWorld(java.util.Map)] ;嵌套异常是 java.lang.IllegalStateException: 找不到 @PathVariable [pathVars] in @RequestMapping] 根本原因 java.lang.IllegalStateException:在@RequestMapping 中找不到@PathVariable [pathVars] 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.resolvePathVariable(AnnotationMethodHandlerAdapter.java:790) 在 org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolvePathVariable(HandlerMethodInvoker.java:702) 在 org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:352) 在 org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:634) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:741) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Unknown Source)

【讨论】:

  • 它没有回答问题
猜你喜欢
  • 2018-05-05
  • 1970-01-01
  • 2011-03-24
  • 2018-01-31
  • 2017-01-08
  • 1970-01-01
  • 2013-01-15
  • 2020-08-28
  • 1970-01-01
相关资源
最近更新 更多