【问题标题】:Struts2 request PUT parameter on bodyStruts2 在 body 上请求 PUT 参数
【发布时间】:2016-03-04 04:13:12
【问题描述】:

我想在 body 上添加 HTTP Request PUT 参数,但我只能这样做

http://localhost:9996/Events/employee/{id}.json?name={name}

那么如何把名字放在身体上?

这里是我的控制器

public class EmployeeController implements ModelDriven<Object>{
private static final long serialVersionUID = 1L;
private String id;
private String name;
private Object model;  
private EmployeeRepository employeeRepository = new EmployeeRepository();

//GET
public HttpHeaders index() { 
    model = employeeRepository.findAllEmployee(); 
    return new DefaultHttpHeaders("index").disableCaching();
}

// GET
public HttpHeaders show() { 
    model = employeeRepository.getEmployeeById(id);
    return new DefaultHttpHeaders("show").disableCaching();
}

//POST
public HttpHeaders create() { 
    Integer empId = Integer.parseInt(id);
    Employee emp = new Employee(empId, name, "PQR");
    employeeRepository.addEmployee(emp);
    model = employeeRepository.findAllEmployee();
    return new DefaultHttpHeaders("create").disableCaching();
}

//PUT
public HttpHeaders update() {  
    Integer empId = Integer.parseInt(id);
    Employee emp = new Employee(empId, name, "PQR");
    employeeRepository.updateEmployee(emp);
    model = employeeRepository.findAllEmployee();
    return new DefaultHttpHeaders("update").disableCaching();
}

//DELETE
public HttpHeaders destroy() {   
    employeeRepository.deleteEmployee(id); 
    model = employeeRepository.findAllEmployee();
    return new DefaultHttpHeaders("destroy").disableCaching();
}

public  String  getId()                 { return id; } 
public  void    setId(String id)        { this.id = id; } 
public  String  getName()               { return name; } 
public  void    setName(String name)    { this.name = name; } 
public  Object  getModel()              { return model; }

【问题讨论】:

  • 你在哪里/如何构造/使用这个 url?
  • 我在 chrome 扩展中使用高级 REST 客户端
  • S2 是如何关联的?搜索如何在 chrome 扩展中使用 advance REST 客户端。
  • 是的,它与 S2 有关,因为当我在正文中添加参数“名称”并调试源时,参数名称为空
  • 如果它在正文中,为什么应该设置name in action?您正在使用模型驱动,停止它或学习如何正确使用它。

标签: java struts2 httprequest restful-url


【解决方案1】:

您需要为您的操作添加JSON Interceptor,它应该类似于下面的代码。

<package name="movies" extends="rest-default, json-default">

        <interceptors>
            <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>

            <interceptor-stack name="jsonStack">
                <interceptor-ref name="json"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>

<action name="movies" class="com.struts.movie.action.MoviesController">
            <interceptor-ref name="jsonStack"/>

            <result type="json">
                <!-- declarations for mappings from Request JSON Body goes here-->
                <param name="root">movie</param>
            </result>
        </action>

 </package>

这里有一个问题,我遇到了一个简单的 JSON 结构,如下所示,

{
    "hello": {
        "name":"kav"
    },
    "uid":"fdsfds"
}

其中hello 旨在映射到POJO class Hello.java,该Hello.java 在控制器中被声明为变量(private Hello hello; 及其公共getter 和setter)。而uid 旨在映射到控制器中声明的String 变量uid(如private String uid; 及其公共getter 和setter)。在 &lt;result type="json"&gt; 标记中没有提到 hello 的情况下,这已完全映射,例如 &lt;param name="root"&gt;hello&lt;/param&gt;。

movie 的情况并非如此,因为它有嵌套对象,如下面的代码,

public class Movie{

    private String movieName;
    private String movieID;
    .... other variables
    private List<Actor> actors;
    private List<Review> reviews;

   // Declarations of constructor, Getters & Setters
}

不知道为什么会这样。

【讨论】:

    猜你喜欢
    • 2016-06-22
    • 1970-01-01
    • 2012-08-03
    • 2011-11-03
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多