将JSONObject作为参数传递给Spring MVC

时间:2013-01-14 03:12:24

标签: java spring-mvc jetty

我希望使用Spring MVC实现REST服务,我在URL "/url/lookup/{jsonparm}"传递以下对象:

{"url":"http://bubba.com/foo/bar", "max_hops":3}

我尝试了以下内容:

@RequestMapping(value = "/url/lookup/{jsonparam}", method = RequestMethod.GET)
@ResponseBody
public String urlLookup(@PathVariable("jsonparam") String jsonparam) {
    // just to see if I can get the parms
    logger.debug("urlLookup get request : " + jsonparam.toString()); 
    JSONObject resp = new JSONObject();
    return resp.toString(); // return an empty JSONObject for now
}

所以我通过调用

来调用它
http://localhost:8080/v1/wsp/url/lookup/%7B%22max_hops%22%3A3%2C%22url%22%3A%22http%3A%2F%2Fbubba.com%2Ffoo%2Fbar%22%7D

没有运气在我的Jetty日志中看到以下内容:

WARNING: No mapping found for HTTP request with URI [/v1/wsp/url/lookup/{"max_hops":3,"url":"http://bubba.com/foo/bar"}] in DispatcherServlet with name 'rest'

注意:

  1. 网址前缀localhost:8080/v1/wsp/是正确的,我的Servlet和请求映射也是正确的
  2. 我已将问题更新为使用@PathVariable作为响应者之一
  3. 感谢。

2 个答案:

答案 0 :(得分:2)

您会混淆GETPOST方法。

或者:

  1. 使用POST方法并实际发布 JSON内容发送到控制器。您可以使用任何REST客户端进行调试,例如。 Chrome浏览器Advanced Rest Client
  2. 使用GET方法(就像您目前一样)。 但是您必须将JSON值作为名为jsonparam的实际参数传递。因此,您的示例应更改为:

     http://localhost:8080/v1/wsp/url/lookup/jsonparam=%7B%22max_hops%22%3A3%2C%22url%22%3A%22http%3A%2F%2Fbubba.com%2Ffoo%2Fbar%22%7D
    
  3. 后者不常见。


    修改

    再看看你的网址,我怀疑你混淆了两个Spring注释:

    1. @PathVariable("jsonparam")和:
    2. @RequestParam("jsonparam")
    3. 当您的网址表明需要@RequestParam时,您正在使用@PathVariable

      <强> EDIT2:

      但是,可以在这里阅读:http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates路径变量可以传递任何简单类型的值。我相信JSON不是其中之一,因此也是你的问题。

      我强烈建议使用POST来交换JSON值。但是,如果这不是一个选项,我建议坚持使用GET方法,@RequestParam来访问参数值,并像上面更正的示例一样传递JSON值。

答案 1 :(得分:1)

您应该使用@PathVariable而不是@RequestParam:

public String urlLookup(@PathVariable("jsonparam") String jsonparam){
}

因为你有@RequestMapping(value =“/ url / lookup / {jasonparam}

你的@RequestMapping值有一个拼写错误。它应该是/ url / lookup / {jsonparam} 而不是{jasonparam}