访问提交的对象时,在Struts2中获取NullPointerException

时间:2012-11-20 09:38:48

标签: java javascript jquery java-ee struts2

我有以下代码和配置

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 个答案:

答案 0 :(得分:1)

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

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

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

我猜他们在发布代码之前都是由代码清理导致的所有错误,但要小心:)

PS:我不知道这是不是一个坏习惯,但我强烈建议你让Action的名字和类相关(例如,processInfodemo.myAction对可以工作在演示中,但是当你有100个动作时,你会发疯的。)

我的2美分......我知道这不能回答你的问题但是,正如你所说,它大部分时间都有效,所以这是一个难以调试的随机问题,不在你的机器上(和假代码)发表:))