简单的ajax返回json,struts2和Restful中有异常

时间:2017-03-07 10:17:26

标签: javascript json ajax rest struts2

我有一个应该从AJAX调用返回JSON的操作,但它会引发异常。

你对这个问题的原因有什么了解吗?

这是我的代码:

@Results({
    @Result(name="json", type="json", params = {"root", "json"})
})

public class TestController{

    public String tableData() {
        String test = "{'winston':'testing'}";
        JSONObject json = JSONObject.fromObject(test);
        return "json";
    }
}

引发的异常:

ERROR RestActionInvocation Exception processing the result.
net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
at net.sf.json.JSONObject.defaultBeanProcessing(JSONObject.java:818)
at net.sf.json.JSONObject._fromBean(JSONObject.java:699)
at net.sf.json.JSONObject.fromObject(JSONObject.java:172)
at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:274)
at net.sf.json.JSONObject._processValue(JSONObject.java:2655)
at net.sf.json.JSONObject.processValue(JSONObject.java:2721)
at net.sf.json.JSONObject.setInternal(JSONObject.java:2736)
at net.sf.json.JSONObject.setValue(JSONObject.java:1424)
at net.sf.json.JSONObject.defaultBeanProcessing(JSONObject.java:765)

1 个答案:

答案 0 :(得分:1)

有两个问题:

  1. Struts2 json result will serialize a Java object into a JSON object本身,因此你必须自己序列化;

  2. 该属性必须可以从外部访问,因此您无法在里面定义操作方法,但您需要在操作级别执行此操作。只有带有getter的非瞬态类级属性才会被序列化(即使使用root属性)。

  3. 您想要的代码是:

    @Results({
        @Result(name = ActionSupport.SUCCESS, 
                type = "json", 
              params = {"root", "myJsonObject"})
    })
    public class TestController extends ActionSupport {
    
        private String myJsonObject;
        public String getMyJsonObject(){ 
            return myJsonObject; 
        }
    
        public String execute() {
            myJsonObject = "someValue";
            return SUCCESS;
        }
    }
    

    使用String后,myJsonObject可以转换为Map或Bean(例如具有winston属性的bean,并为其分配testing值,以便返回

      

    {"winston":"testing"}

    示例中的JSON。