无法访问struts操作类中的JSON请求对象

时间:2014-03-12 09:18:15

标签: java javascript json struts2 nullpointerexception

我通过JavaScript函数中的Ajax调用传递JSON对象。我已将生成的动作链接到struts动作类。我有动作类中的控件,但我的setter没有被调用,因为我面对的是NullPointerException

这是我在JavaScript中的Ajax调用

var arr = {entity:entity,subEntity:subEntity,choice:choice,drinkingWaterChosen:drinkingWaterChosen,roadChosen:roadChosen,groupChoice:groupChoice};   
console.log(JSON.stringify(arr));

url = "<s:url action='FetchQuery'/>";
$.ajax({
  type : 'POST',
  url : url,
  dataType : 'json',
  contentType: 'application/json; charset=utf-8',
  data:JSON.stringify(arr),
  async : false,
  success : function(data) {
      console.log(data);
      alert("I am back "+data);
  }
});

我的Struts配置文件如下所示

<struts>
<package name="default" extends="json-default">
    <result-types>
        <result-type name="json" class="org.apache.struts2.json.JSONResult" />
    </result-types>
    <interceptors>
        <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor" />
    </interceptors>

    <action name="FetchQuery" class="serp.FetchQuery">
        <result type="json"/>
    </action>
</package>

我的Action类如下所示

private String entity;//getter and setters for all variables
private String subEntity;
private String choice;
private String drinkingWaterChosen;
private String roadChosen;
private String groupChoice;

public String execute(){

    System.out.println("Hello world>>>>>>>>>>>>>>>>>");
    String msg = constructQuery();
    return msg;
}

private String constructQuery() {

    if (entity.equals("Hello")) {} //Null pointer exception is raised at this line
}

我认为这个错误是因为实体没有被预先设置。 所以我的问题是如何处理传递给action类的JSON对象。我在这个网站上已经阅读了很多问题并尝试了所有方法,但我仍然无法弄清楚问题。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

错误可能是您的数组,缺少双引号。将其更改为此格式:

var arr = {
              'entity' : entity, 
           'subEntity' : subEntity, 
              'choice' : choice,
 'drinkingWaterChosen' : drinkingWaterChosen, 
          'roadChosen' : roadChosen, 
         'groupChoice' : groupChoice
}; 

答案 1 :(得分:2)

要处理JSON对象,您需要将json拦截器添加到操作配置。

<action name="FetchQuery" class="serp.FetchQuery">
    <result type="json"/>
  <interceptor-ref name="json">
  <interceptor-ref name="defaultStack">
</action>

json拦截器能够解析请求,并使用数据填充操作对象。这是摘自文档页面:

  

如果使用拦截器,则会从请求中的JSON内容填充操作,这些是拦截器的规则:

     
  • “content-type”必须是“application / json”
  • JSON内容必须格式正确,请参阅json.org语法。
  • 对于必须填充的字段,Action必须具有公共“setter”方法。
  • 填充的支持类型有:Primitives(int,long ... String),Date,List,Map,Primitive Arrays,Other class(稍后会详细介绍)和其他类的数组。
  • JSON中要填充在列表或地图中的任何对象都是Map类型(从属性到值的映射) ),任何整数都是Long类型,任何十进制数都是Double类型,任何类型List数组。