【问题标题】:get pathvariable with sending and recieving json data Rest spring mvc通过发送和接收json数据获取路径变量Rest spring mvc
【发布时间】:2015-02-06 17:53:59
【问题描述】:

我正在尝试使用 spring mvc 学习 Rest Web 服务。我关注了this链接。

我能够接收和发送 Json 数据,但我无法通过调用传递路径变量。我无法理解这个问题。

这是我的控制器:

package com.akash.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping(value = "/myRest")
public class MyRestController {

    @RequestMapping(value = "/myAction1/{param1}/", method = RequestMethod.GET, headers = "Accept=application/json")
    public @ResponseBody List<Abc> myAction1(@PathVariable String param1) {

        Abc ob = new Abc();
        ob.setAge(20);
        ob.setName("obama-"+param1);
        List<Abc> listOfAbc = new ArrayList<Abc>();
        listOfAbc.add(ob);
        return listOfAbc;
    }

    /*
     * curl -X GET -H "Accept:application/json"
     * http://localhost:8080/myRest/myAction1/123
     */

    @RequestMapping(value = "/myAction2", method = RequestMethod.POST, headers = {
            "Accept=application/json", "Content-type=application/json" })
    public @ResponseBody List<Abc> myAction2(@RequestBody AbcWrapper wrapper) {

        Abc ob = new Abc();
        ob.setAge(wrapper.getListOfAbc().size());
        ob.setName("obama");
        List<Abc> listOfAbc = new ArrayList<Abc>();
        listOfAbc.add(ob);
        return listOfAbc;
    }

    /*
     * curl -X POST -H "Accept: application/json" -H
     * "Content-Type: application/json" http://localhost:8080/myRest/myAction2
     * -d "{\"listOfAbc\":[{\"age\":20,\"name\":\"akash\"}]}"
     */
}

class Abc {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class AbcWrapper {
    List<Abc> listOfAbc;

    public List<Abc> getListOfAbc() {
        return listOfAbc;
    }

    public void setListOfAbc(List<Abc> listOfAbc) {
        this.listOfAbc = listOfAbc;
    }
}

我可以执行 myAction2 但无法执行 myAction1。 如果我从 myAction1 中删除路径变量,一切正常。

请帮忙。

【问题讨论】:

  • 您在执行 GET 后收到了哪个 HTTP 代码?
  • curl -i 标志在输出中添加 HTTP 标头。很适合调试。我能想到的唯一另一件事是尝试添加@PathVariable("param1") String param1。不确定变量名称是否匹配是否需要,但这是我一直看到它使用的方式。

标签: java json spring spring-mvc jackson


【解决方案1】:

我找到了解决问题的方法。有很多错误。

(1)第一个问题是spring security,它正在验证url并将其重定向到登录页面。

我改变了这个

<http pattern="/myRest/*" security="none" />

<http pattern="/myRest/**" security="none" />

(2)将 myAction1 方法更改为

@RequestMapping(value = "/myAction1/{param1}", method = RequestMethod.GET, headers = "Accept=application/json")
    public @ResponseBody List<Abc> myAction1(@PathVariable("param1") String param1, Model model) {

在 {param1} 之后删除了一个额外的斜杠

我从 curl -i 参数获得的所有信息

解决问题之前

HTTP/1.1 302 Found
Date: Sat, 07 Feb 2015 05:35:55 GMT
Set-Cookie: JSESSIONID=1kk70yuy7kc501glpcd0m9t4py;Path=/
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Location: http://localhost:8080/login;jsessionid=1kk70yuy7kc501glpcd0m9t4py
Content-Length: 0
Server: Jetty(9.2.3.v20140905)

解决问题后

HTTP/1.1 200 OK
Date: Sat, 07 Feb 2015 05:37:55 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Server: Jetty(9.2.3.v20140905)

[{"age":20,"name":"obama-123"}]

干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2018-02-07
    • 2015-07-07
    • 2017-02-23
    • 2012-02-12
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多