我正在使用 Struts2 并且request.getInputStream()
无法使用,因为它在第二次使用时会出错,首先可能已经被任何拦截器使用。
所以,我相信必须有某种方法来获取请求正文。但是我在网上没有找到任何东西,请帮助。
我正在使用 Struts2 并且request.getInputStream()
无法使用,因为它在第二次使用时会出错,首先可能已经被任何拦截器使用。
所以,我相信必须有某种方法来获取请求正文。但是我在网上没有找到任何东西,请帮助。
正如您所说,拦截器(我猜是 JSONInterceptor)之前已经为您完成了这项工作。可能你有类似的 struts.xml 结构:
struts.xml
<constant name="struts.action.extension" value="xhtml,,xml,json,action"/>
<constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper" />
<constant name="struts.mapper.prefixMapping" value="/rest:rest,:struts"/>
<constant name="struts.convention.action.suffix" value="Controller"/>
<constant name="struts.convention.action.mapAllMatches" value="true"/>
<constant name="struts.convention.default.parent.package" value="rest-default"/>
<constant name="struts.convention.package.locators" value="rest"/>
<constant name="struts.rest.namespace" value="/rest" />
<constant name="struts.rest.negotiation.handlerOverride.application/json" value="json" />
<package name="rest" namespace="/rest" extends="rest-default">
<interceptors>
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
</interceptors>
<action name="yourAction" class="com.struts.rest.MyController">
<interceptor-ref name="json" />
<interceptor-ref name="defaultStack"/>
</action>
</package>
然后,如果您尝试解析这样的 JSON 请求:
{ "token":"mh5h6jrjkvnrk56" }
你应该有一个这样的控制器(或动作):
package com.struts.rest;
import ...
public class MyController implements ModelDriven<Result>{
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(MyController.class.getName());
private String token;
// Handles GET requests
public String index() {
logger.info("token: " + token);
return "index";
}
// Handles /POST requests
public String create(){
// ....
return "create"
}
// Handles /PUT requests
public HttpHeaders update() {
// ....
return "update"
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
}
在RequestAware/ServletRequestAware
Action 中,您应该使用 访问请求request.getInputStream()
,但是当 JSONInterceptor 起作用时,只需让他完成工作。创建尽可能多的字段,以便在 Action/Controller 中解析 JSON 元素。在这个例子中,我创建了一个String token
字段(使用它的 setter 和 getter)来保存 JSON 元素“token”的内容。
当 /GET(带有 {"token":"mh5h6jrjkvnrk56"})完成时,index()
将调用该字段并且该字段token
具有值“mh5h6jrjkvnrk56”(如示例中所示)。