JSON序列化(使用Jquery插件)w / Struts2拦截器 -

时间:2010-12-14 20:59:22

标签: json struts2 interceptor

我正在尝试实现http://code.google.com/p/struts2-jquery/wiki/SelectTag#A_simple_Doubleselect_with_Topics,但我似乎无法成功地将json拦截器与其他拦截器结合起来。

在我的struts.xml中:

<package name="admin" namespace="/admin" extends="struts-default,json-default">
    <action name="LoadLists" method="loadLists" class="test.JSONAction">
        <interceptor-ref name="json">
            <param name="contentType">application/json</param>
            <!--interceptor added to override this property below-->
            <param name="excludeNullProperties">true</param> 
        </interceptor-ref>
        <result name="success" type="json"/>
        <interceptor-ref name="servletConfig"/>
    </action>
</package>

这是一些动作类代码。

请注意,我需要session变量,因此在上面添加了<interceptor-ref name="servletConfig"/>行来设置会话变量,以便可以在以下Java代码中使用它:

public String loadLists() {
    items = (List<String>) session.get("itemsList");
    if (itemSelected.equals...
    // Do stuff to process the list and generate the second list...            
}

public void setItemSelected(String itemSelected) {
    this.itemSelected = itemSelected;
}

但是当我有<interceptor-ref name="servletConfig"/>时,错误日志会显示:

org.apache.struts2.json.JSONInterceptor.debug:68 - Content type must be 'application/json' or 'application/json-rpc'. Ignoring request with content type application/x-www-form-urlencoded

并且变量itemSelected永远不会被设置,因为忽略了json序列化!

如果我删除<interceptor-ref name="servletConfig"/>,则无法访问会话!

我错过了什么?

1 个答案:

答案 0 :(得分:0)

这里的问题似乎是您没有对您的操作发出AJAX / JSON请求,而是使用标准表单方法向其发布。

您提供的消息是,Content-Type 请求标头应与JSON相关,而是x-www-form-urlencoded。换句话说,请求不是AJAX / JSON请求,而只是一个普通的表单提交。

仔细检查您向JSONAction发出请求的方式,并确保您实际上正在发送请求。