Java 使用Struts2 json插件时如何在Struts2中获取请求正文

Java 使用Struts2 json插件时如何在Struts2中获取请求正文,java,jakarta-ee,struts2,struts2-json-plugin,Java,Jakarta Ee,Struts2,Struts2 Json Plugin,我正在使用Struts2和请求。getInputStream()无法使用,因为它在第二次使用时出错,第一次可能已被任何拦截器使用 因此,我相信一定有办法获得请求机构。但是我在互联网上没有找到任何东西,请帮忙。正如您所说,拦截器(我猜JSONInterceptor)以前已经为您完成了这项工作。您可能有类似的struts.xml结构: struts.xml <constant name="struts.action.extension" value="xhtml,,xml,json,actio

我正在使用Struts2和
请求。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>
您应该有这样一个控制器(或操作):

{ "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;
    }
}
package com.struts.rest;
导入。。。
公共类MyController实现模型驱动{
私有静态最终长serialVersionUID=1L;
私有静态最终记录器Logger=Logger.getLogger(MyController.class.getName());
私有字符串令牌;
//处理GET请求
公共字符串索引(){
logger.info(“令牌:+token”);
返回“索引”;
}
//处理/发布请求
公共字符串create(){
// ....
返回“创建”
}
//处理/放置请求
公共HttpHeaders更新(){
// ....
返回“更新”
}           
公共字符串getToken(){
返回令牌;
}
公共void setToken(字符串令牌){
this.token=token;
}
}
RequestAware/ServletRequestAware
操作中,您应该使用
request.getInputStream()
访问请求,但当JSONInterceptor操作时,只需让他完成工作即可。在Action/Controller中创建想要解析的JSON元素的尽可能多的字段。在本例中,我创建了一个
stringtoken
字段(带有setter和getter)来保存JSON元素“token”的内容


当/GET(使用{“token”:“mh5h6jrjkvnrk56})完成时,调用
index()
,并且
token
字段的值为“mh5h6jrjkvnrk56”(如示例所示)。

Struts 2 Struts 2 StrutsPrepareAndExecuteFilter必须读取请求,以便提取信息来填充操作对象,等等。请提供更多信息,说明您需要从该输入流中恢复什么;不管它是什么,也许Struts 2已经在为它做这件事了you@Jorge_B在我的例子中,请求体中发送了JSON,如果出现任何错误,我需要登录数据库,但我无法获取请求体。您是否使用struts2 JSON插件获取非法状态异常?如果是这样的话,那么可能是
JSONInterceptor
使用了请求流。@Pratik我还没有编写任何代码。