Java SpringMVC中通过json的参数和继承

Java SpringMVC中通过json的参数和继承,java,jquery,json,spring-mvc,Java,Jquery,Json,Spring Mvc,我需要一个建议。我试图将对象列表作为参数传递给使用SpringMVC3编写的方法控制器,所有这些都是使用ajax编写的。这些对象是widget类的Decentant。我将首先向您展示代码 ajax调用: function buildWidget(obj){ var result = null; switch(obj.className){ case 'text': result = { x:obj.control.x

我需要一个建议。我试图将对象列表作为参数传递给使用SpringMVC3编写的方法控制器,所有这些都是使用ajax编写的。这些对象是widget类的Decentant。我将首先向您展示代码

ajax调用:

function buildWidget(obj){
    var result = null;
    switch(obj.className){
    case 'text':
        result = {
            x:obj.control.x
            ,y:obj.control.y
            ,height: obj.control.height
            ,width: obj.control.width
            ,text: obj.text
        };
        break;
    case 'youtube':
        result = {
            x:obj.control.x
            ,y:obj.control.y
            ,height: obj.control.height
            ,width: obj.control.width
            ,videos: obj.videos
        };
        break;
    }
    return result;
}

var all = new Array();
            for(i=0;i<figures.size;i++)
                all.push(buildWidget(figures.data[i].widget));
            jQuery.getJSON("pages/save.html", { widgetsList: jQuery.toJSON(all) }, function(myresult) {
                alert('ok');
            });
控制器(这里的问题)

@RequestMapping(value=“/pages/save”,method=RequestMethod.GET)
public@ResponseBody字符串保存(@RequestParam String-widgetsList){
类型listType=newTypeToken(){}.getType();
List adapters=new Gson().fromJson(widgetsList,listType);
用于(WidgetAdapter a:适配器){
System.out.println(a.getX());
}
返回新的Gson().toJson(newactionresult(“msg”);
}
因此,当方法控制器被调用时,Gson创建一个列表适配器,所有元素都属于类WidgetAdapter,而不是textwidgetapter或YoutubeWidget。有没有办法做到这一点??我的意思是将参数作为类的元素中心元素列表传递,并由Gson正确转换

谢谢,我希望你说清楚。英语不是我的母语


pd:我正在以一种好的方式或更好的方式来做这一切。

好的!我告诉你我是如何解决这个问题的。请告诉我你的意见。 我创建了一个自定义反序列化程序(这里我创建了具体实例)。代码如下:

@RequestMapping(value = "/pages/save",method=RequestMethod.GET)
    public @ResponseBody String save(@RequestParam String widgetsList){
        GsonBuilder gson = new GsonBuilder();
        // register the custom deserializer for my WidgetAdapterClass
        gson.registerTypeAdapter(WidgetAdapter.class, new WidgetDeserialization());
        Type listType = new TypeToken<List<WidgetAdapter>>() {}.getType();
        // create gson an deserialize object
        List<WidgetAdapter> adapters = gson.create().fromJson( widgetsList, listType);
        // just for testing proposes
        for(WidgetAdapter a :adapters){
            System.out.println(a.getWidth());
        }

        return new Gson().toJson(new ActionResult("Ok"));
    }
@RequestMapping(value=“/pages/save”,method=RequestMethod.GET)
public@ResponseBody字符串保存(@RequestParam String-widgetsList){
GsonBuilder gson=新的GsonBuilder();
//为我的WidgetAdapterClass注册自定义反序列化程序
registerTypeAdapter(WidgetAdapter.class,新的WidgetDeserialization());
类型listType=newTypeToken(){}.getType();
//创建一个反序列化对象
List adapters=gson.create().fromJson(widgetsList,listType);
//只是为了测试
用于(WidgetAdapter a:适配器){
System.out.println(a.getWidth());
}
返回新的Gson().toJson(newactionresult(“Ok”));
}
具体的反序列化程序

public class WidgetDeserialization implements JsonDeserializer<WidgetAdapter> {

    /***
     * factory method for custom WidgetAdapter
     * @param json
     * @return WidgetAdapter
     */
    private WidgetAdapter getWidget(JsonObject json){
        WidgetAdapter adapter = null;
        //obtain widget class. Util for instanciate concrete class
        String className = json.get("className").getAsString();
        // create concrete classes and set concrete atributes
        if("text".equals(className)){
            adapter = new TextWidgetAdapter(json.get("text").getAsString());
        }else if("youtube".equals(className)){
            adapter = new YoutubeWidgetAdapter(json.get("videos").getAsString());
        }
        // if adapter is created common atributes are set
        if(adapter!=null){
            adapter.setHeight(json.get("height").getAsInt());
            adapter.setWidth(json.get("width").getAsInt());
            adapter.setX(json.get("x").getAsInt());
            adapter.setY(json.get("y").getAsInt());
        }
        return adapter;
    }

    @Override
    public WidgetAdapter deserialize(JsonElement element, Type arg1,
            JsonDeserializationContext arg2) throws JsonParseException {
        JsonObject obj = element.getAsJsonObject();
        return getWidget(obj);
    }

}
公共类WidgetDeserialization实现JsonDeserializer{
/***
*自定义WidgetAdapter的工厂方法
*@param-json
*@return-WidgetAdapter
*/
私有WidgetAdapter getWidget(JsonObject json){
WidgetAdapter=null;
//获取instanciate具体类的widget class.Util
字符串className=json.get(“className”).getAsString();
//创建混凝土类并设置混凝土排水管
if(“text”.equals(类名)){
adapter=newtextWidgetAdapter(json.get(“text”).getAsString());
}else if(“youtube.equals(className)){
adapter=newyoutubewidgetapter(json.get(“videos”).getAsString());
}
//如果创建了适配器,则会设置公共分区
if(适配器!=null){
setHeight(json.get(“height”).getAsInt();
setWidth(json.get(“width”).getAsInt();
setX(json.get(“x”).getAsInt());
setY(json.get(“y”).getAsInt());
}
返回适配器;
}
@凌驾
公共WidgetAdapter反序列化(JsonElement元素,类型arg1,
JsonDeserializationContext arg2)引发JsonParseException{
JsonObject obj=element.getAsJsonObject();
返回getWidget(obj);
}
}

我希望它能帮助你

好的!我告诉你我是如何解决这个问题的。请告诉我你的意见。 我创建了一个自定义反序列化程序(这里我创建了具体实例)。代码如下:

@RequestMapping(value = "/pages/save",method=RequestMethod.GET)
    public @ResponseBody String save(@RequestParam String widgetsList){
        GsonBuilder gson = new GsonBuilder();
        // register the custom deserializer for my WidgetAdapterClass
        gson.registerTypeAdapter(WidgetAdapter.class, new WidgetDeserialization());
        Type listType = new TypeToken<List<WidgetAdapter>>() {}.getType();
        // create gson an deserialize object
        List<WidgetAdapter> adapters = gson.create().fromJson( widgetsList, listType);
        // just for testing proposes
        for(WidgetAdapter a :adapters){
            System.out.println(a.getWidth());
        }

        return new Gson().toJson(new ActionResult("Ok"));
    }
@RequestMapping(value=“/pages/save”,method=RequestMethod.GET)
public@ResponseBody字符串保存(@RequestParam String-widgetsList){
GsonBuilder gson=新的GsonBuilder();
//为我的WidgetAdapterClass注册自定义反序列化程序
registerTypeAdapter(WidgetAdapter.class,新的WidgetDeserialization());
类型listType=newTypeToken(){}.getType();
//创建一个反序列化对象
List adapters=gson.create().fromJson(widgetsList,listType);
//只是为了测试
用于(WidgetAdapter a:适配器){
System.out.println(a.getWidth());
}
返回新的Gson().toJson(newactionresult(“Ok”));
}
具体的反序列化程序

public class WidgetDeserialization implements JsonDeserializer<WidgetAdapter> {

    /***
     * factory method for custom WidgetAdapter
     * @param json
     * @return WidgetAdapter
     */
    private WidgetAdapter getWidget(JsonObject json){
        WidgetAdapter adapter = null;
        //obtain widget class. Util for instanciate concrete class
        String className = json.get("className").getAsString();
        // create concrete classes and set concrete atributes
        if("text".equals(className)){
            adapter = new TextWidgetAdapter(json.get("text").getAsString());
        }else if("youtube".equals(className)){
            adapter = new YoutubeWidgetAdapter(json.get("videos").getAsString());
        }
        // if adapter is created common atributes are set
        if(adapter!=null){
            adapter.setHeight(json.get("height").getAsInt());
            adapter.setWidth(json.get("width").getAsInt());
            adapter.setX(json.get("x").getAsInt());
            adapter.setY(json.get("y").getAsInt());
        }
        return adapter;
    }

    @Override
    public WidgetAdapter deserialize(JsonElement element, Type arg1,
            JsonDeserializationContext arg2) throws JsonParseException {
        JsonObject obj = element.getAsJsonObject();
        return getWidget(obj);
    }

}
公共类WidgetDeserialization实现JsonDeserializer{
/***
*自定义WidgetAdapter的工厂方法
*@param-json
*@return-WidgetAdapter
*/
私有WidgetAdapter getWidget(JsonObject json){
WidgetAdapter=null;
//获取instanciate具体类的widget class.Util
字符串className=json.get(“className”).getAsString();
//创建混凝土类并设置混凝土排水管
if(“text”.equals(类名)){
adapter=newtextWidgetAdapter(json.get(“text”).getAsString());
}else if(“youtube.equals(className)){
adapter=newyoutubewidgetapter(json.get(“videos”).getAsString());
}
//如果创建了适配器,则会设置公共分区
if(适配器!=null){
setHeight(json.get(“height”).getAsInt();
setWidth(json.get(“width”).getAsInt();
setX(json.get(“x”).getAsInt());
setY(json.get(“y”).getAsInt());
}
返回适配器;
}
@凌驾
公共WidgetAdapter反序列化(JsonElement元素,类型arg1,
JsonDeserializationContext arg2)引发JsonParseException{
JsonObject obj=element.getAsJsonObject();
返回getWidget(obj);
}
}
我希望有帮助