我有以下代码和配置

Pojo

public class MyInfo {
    private String name;
    private String desc;

    //... getters, setters ...
}


我的行动

package demo;

//... import statements ...

public class MyAction extends ActionSupport {

    public static final String FAILURE = "failure";

    private MyInfo info;
    private String result;
    private String message;

    public String execute() {
        result = SUCCESS;
        return result;
    }

    public String processInfo() {
        result = FAILURE;
        try {
            String name = info.getName();
            //... More Statements //
            result = SUCCESS;
        } catch(Exeption e) {
            message = "Unable to process information : " + e.getMessage;
        }

        return result;
    }

    //Getter and Setter methods of info, result, and message.


}


Struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <constant name="struts.devMode" value="true" />
    <package name="base-ajax" namespace="/" extends="json-default,struts-default" abstract="true" >
        <global-results>
            <result type="json"></result>
            <result name="failure" type="json"></result>
        </global-results>
    </package>

    <package name="info-ajax" namespace="/" extends="base-ajax">
        <action name="processInfo" method="processInfo" class="demo.MyAction">
            <result type="json"></result>
        </action>
    </package>
<struts>


渲染的JSP代码段

<form id="infoForm" method="post" action="processInfo.action">
    <input id="infoName" type="text" name="info.name"></input>
    <input id="infoDesc" type-"text" naame="info.desc"></input>
    <a id="btn-submit" href="#">Submit</a>
</form>


JSP头部的jQuery。

var jQ = jQuery.noConflict();

jQ(document).ready(function() {
    jQ("#btn-submit").click(function() {
        //perform some validation
        var formData = jQ("#infoForm").serialize();
        jQ.ajax({
            url: "processInfo.action",
            data: formData,
            dataType: "json",
            error: function() {
                alert("Some error has occurred while processing request.");
            },
            success: function(response) {
                if(response.result = "failure") {
                    alert("Information processing failed.");
                } else if(response.result) {
                    alert("Information processed successfully.");
                }
            }
        });
    });
});


在大多数情况下,它运行平稳。但是有时我在MyAction.processInfo()info.getName()中得到NullPointerException。似乎未填充info。我已经看到表单以正确的值提交(使用了Firebug和篡改数据插件进行分析)。我不相信params拦截器会跳过创建info的过程。我的配置中可能缺少某些内容。谁能找出答案或指导我幕后发生的事情?

最佳答案

它不可能以这种方式工作。

1)您将Action的方法声明为private

2)您从SUCCUESS内部返回SUCCESS而不是processInfo

我猜它们都是在将代码发布到这里之前由代码清理引起的错误,但是要小心:)

PS:我不知道这是不是一个不好的做法,但是我强烈建议您将Action的名称和类进行关联(例如,processInfodemo.myAction对可以在演示中使用,但是当您将有100次操作,您会发疯)。

我的2美分...我知道这不能回答您的问题,但是,正如您所说,它在大多数情况下都有效,因此这是一个随机问题,很难调试,因为它不在您的计算机上(并且贴有伪造的代码:) )

09-12 13:15