【问题标题】:Struts2 JSON interceptor not populating my Action classStruts2 JSON 拦截器没有填充我的 Action 类
【发布时间】:2012-01-16 21:45:25
【问题描述】:

我正在开发一个 Web 应用程序,在该应用程序中,客户端 JavaScript 库 (ExtJS) 使用 JSON 请求有效负载向支持 Struts 的后端发送请求。我的问题是我不知道如何将有效负载中的变量获取到我的 Action 类中。

通过使用日志语句,我知道前端正在调用我的操作类中的正确方法。只是我期望的变量是null,而它们不应该是。

我正在尝试使用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>

有什么想法吗?

【问题讨论】:

    标签: json jakarta-ee struts2


    【解决方案1】:

    我自己发现了问题。我未能正确配置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>
    

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

    【讨论】:

    • 这将运行 JSON 拦截器,这可能没问题,但不太可能。对于大多数用例,将默认拦截器堆栈设置为 "jsonValidationWorkflowStack" 会更正确。
    • 感谢 Dave 了解这一点。我在研究上述解决方案时发现,但为了简化 SO 读者的解决方案,我忽略了它。我还为我正在使用的(旧版)代码库正在使用的默认拦截器堆栈添加了一个 标签。
    • 为清楚起见添加了对 myDefaultInterceptorStack 的引用。
    • myDefaultInterceptorStack 由什么组成?
    • 添加&lt;interceptor-ref name="defaultStack"/&gt; 代替&lt;interceptor-ref name="myDefaultInterceptorStack" /&gt; 以及&lt;interceptor-ref name="json" /&gt; 对我有用。
    【解决方案2】:

    JSON 插件需要遵循一些步骤才能正常工作,这里只是其中的几个

    1. “内容类型”必须是“应用程序/json”。
    2. JSON 内容必须格式正确,语法见 json.org。

    如果您可以从调用 Action 类的位置粘贴 JS (ExtJS) 的相关部分并将数据发送到您的操作类,那就更好了。

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

    json-plugin

    【讨论】:

    • 谢谢 Umesh。我发现了问题,我只是将其作为单独的答案发布。这是一个 struts.xml 错误。
    猜你喜欢
    • 2012-03-20
    • 2020-04-19
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多