有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在SpringMVC上将JSONObject作为参数传递

我希望使用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

运气不好,请在我的码头日志中查看以下内容:

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. url前缀localhost:8080/v1/wsp/正确,我的Servlet和请求映射也正确
  2. 我已经更新了这个问题,用一个@PathVariable作为回答者的建议之一

谢谢


共 (2) 个答案

  1. # 1 楼答案

    你混淆了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
      

    后者不太常见


    编辑:

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

    1. @PathVariable("jsonparam")和:
    2. @RequestParam("jsonparam")

    您正在使用@RequestParam,而您的URL表明需要@PathVariable

    Edit2:

    然而,正如这里可以看到的:http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templatespath变量可以传递一个任何简单类型的值。我相信JSON不是其中之一,所以你有问题

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

  2. # 2 楼答案

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

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

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

    您的@RequestMapping值中有一个输入错误。它应该是/url/lookup/{jsonparam}而不是{jasonparam}