Struts2 JSON拦截器没有填充我的Action类

时间:2012-01-16 21:45:25

标签: json java-ee struts2

我正在开发一个Web应用程序,其中客户端JavaScript库(ExtJS)使用JSON请求有效负载向启用Struts的后端发送请求。我的问题是我无法弄清楚如何将有效载荷中的变量导入我的Action类。

我从使用日志语句知道前端调用了我的action类中的正确方法。只是我期待的变量是null,而它们不应该是。{/ p>

我正在尝试使用struts2-json-plugin作为拦截器。 Struts拦截器对我来说是新手,我无法在网上找到任何关于以这种方式使用struts2-json-plugin的明确例子。

以下是我pom.xml中的Struts依赖项:

<dependency>
  <groupId>org.apache.struts</groupId>
  <artifactId>struts2-core</artifactId>
  <version>2.2.3.1</version>
</dependency>
<dependency>
   <groupId>org.apache.struts</groupId>
   <artifactId>struts2-json-plugin</artifactId>
   <version>2.2.3.1</version>
</dependency>        

这是请求正文(关注Firebug):

{"id":15,"translation":"Blah blah"}

我的Action类的相关部分如下所示:

public class TranslationsAction extends ActionSupport {

    private Long id;
    private String translation;

    public String save() throws Exception {

        log.debug("TranslationsAction.save() called.");
        log.debug("ID: " + this.id + ", Translation: " + this.translation);

        return "{\"foo\":\"bar\"}";
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setTranslation(String translation) {
        this.translation = translation;
    }

}

以下是我struts.xml的相关部分:

<package name="foo" namespace="/foobar" extends="json-default">    
    <action name="save-translation" method="save"
            class="my.package.name.action.TranslationsAction">
        <result name="success">/jsp/json.jsp</result>
    </action>
</package>

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我自己发现了这个问题。我无法正确配置struts.xml。我需要首先在我的包中定义一个拦截器,然后告诉我的动作使用它,如:

<package name="foo" namespace="/foobar" extends="json-default">    

    <!-- Added this: -->
    <interceptors>
        <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
    </interceptors>

    <action name="save-translation" method="save"
            class="my.package.name.action.TranslationsAction">

        <!-- And added this: -->
        <interceptor-ref name="myDefaultInterceptorStack" />
        <interceptor-ref name="json" />

        <result name="success">/jsp/json.jsp</result>
    </action>
</package>

这对我来说是一个愚蠢的遗漏。 : - \

答案 1 :(得分:0)

好的JSON插件需要遵循一些步骤才能正常工作,而这里只有少数几个

  1. &#34;内容类型&#34;必须是&#34; application / json&#34;。
  2. JSON内容必须格式正确,请参阅json.org for grammar。
  3. 如果您可以从调用Action类的位置粘贴JS(ExtJS)的相关部分并将数据发送到您的操作类,那就更好了。

    请查看官方JSON插件页面了解详情

    json-plugin