2012-07-17 71 views
2

我想通过submited表单到我的页面控制器。我构建JSON对象是这样的:弹簧mvc传递对象post方法

{ 
"periodId": "1", 
"domainId": "46", 
"modelTypeId": "1", 
"modelGroup": { 
    "modelGroupName": "123", 
    "modelGroupDescription": "abc" 
} 
} 

在哪里,我想对象*Id作为整数传递和modelGroup为完整的对象。所以,我的目标就是以某种方式使这项工作:

JS文件

jQuery.ajax("/Models/SaveModel", { 
    type:"POST", 
    dataType:'json', 
    contentType:"application/json", 
    data:JSON.stringify(output) 
}); 

页面控制器

@RequestMapping(value = "/SaveModel", method = RequestMethod.POST, headers = {"content-type=application/json"}) 
public 
@ResponseBody 
boolean createModel(SettlementModelGroup modelGroup, 
        Integer periodId, 
        Integer domainId, 
        Integer modelTypeId) 
{ 
    //process data here 
} 

是否有可能还是我必须做出@RequestBody String object注释,然后解析JSON文件?

+0

春天会为你转换,我为你得到正确的JSON和相应的请求参数 – NimChimpsky 2012-07-17 14:36:49

+0

你能用我提供的数据的例子写一个答案吗? – kamil 2012-07-17 14:38:02

回答

1

Spring MVC的默认情况下,你将无法做到这一点 - 如果你想使用默认的方法,你可以像你所说的创建一个包装类型与modelGroupperiodIddomainIdmodelTypeId@RequestBody注释包装类型。

如果你绝对要沿着你写什么的写法,这种做法将是:

创建自定义的注释 - 说@JsonArg

标注使用此标注相关参数

boolean createModel(@JsonArg SettlementModelGroup modelGroup, 
        @JsonArg Integer periodId, 
        @JsonArg Integer domainId, 
        @JsonArg Integer modelTypeId); 

编写自定义HandlerMethodArgumentResolver将支持@JsonArg标注的参数:

boolean supportsParameter(MethodParameter parameter){ 
    return (parameter.getParameterAnnotation(JsonArg.class)!=null); 
} 

写逻辑请求主体解析出相关参数:

public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { 
+0

感谢您的完整答案!我想更简单的方法将传递整数作为路径变量? – kamil 2012-07-17 15:20:51

0

如果您创建了一个对象,该对象包含上面列出的参数中的所有4个对象,那么您可以仅使用@RequestBody注释该参数,它会将其全部转换为您。

0

@RequestBody后,必须写一个对象,其中包含模型类(getter/setter方法)

相关问题