mon*_*jbl 17 java spring json spring-mvc
我正在尝试将Map的JSON表示作为POST参数发送到我的控制器中.
@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" })
public @ResponseBody Results search(@RequestParam("filters") HashMap<String,String> filters, HttpServletRequest request) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
我发现@RequestParam只会抛出500错误,所以我尝试使用@ModelAttribute.
@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" })
public @ResponseBody Results search(@ModelAttribute("filters") HashMap<String,String> filters, HttpServletRequest request) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
这将正确响应请求,但我意识到地图是空的.随后的实验,我发现任何对象(不仅仅是HashMap)都会被实例化,但是不会填充任何字段.我的类路径上有Jackson,而我的控制器将使用JSON进行响应.但是,我的当前配置似乎不允许Spring通过GET/POST参数读取JSON.
如何将客户端AJAX请求中的对象的JSON表示作为请求参数传递给Spring控制器并获取Java对象?
编辑添加我的相关Spring配置
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="html" value="text/html" />
<entry key="json" value="application/json" />
</map>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="prefixJson" value="true" />
</bean>
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
</list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
根据评论者的建议,我尝试了@RequestBody.这将起作用,只要JSON字符串引用双引号即可.
@RequestMapping(value = "/search.do", method = RequestMethod.POST, consumes = { "application/json" })
public @ResponseBody Results<T> search(@RequestBody HashMap<String,String> filters, HttpServletRequest request) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
这确实解决了我的直接问题,但我仍然对如何通过AJAX调用传递多个JSON对象感到好奇.
小智 6
这确实解决了我眼前的问题,但我仍然对ou如何通过AJAX调用传递多个JSON对象感到好奇。
最好的方法是使包装对象包含要传递的两个(或多个)对象。然后,您将JSON对象构造为两个对象的数组,即
[
{
"name" : "object1",
"prop1" : "foo",
"prop2" : "bar"
},
{
"name" : "object2",
"prop1" : "hello",
"prop2" : "world"
}
]
Run Code Online (Sandbox Code Playgroud)
然后,在控制器方法中,将请求主体作为一个对象接收,并提取两个包含的对象。即:
@RequestMapping(value="/handlePost", method = RequestMethod.POST,
consumes = { "application/json" })
public void doPost(@RequestBody WrapperObject wrapperObj) {
Object obj1 = wrapperObj.getObj1;
Object obj2 = wrapperObj.getObj2;
//Do what you want with the objects...
}
Run Code Online (Sandbox Code Playgroud)
包装对象看起来像...
public class WrapperObject {
private Object obj1;
private Object obj2;
public Object getObj1() {
return obj1;
}
public void setObj1(Object obj1) {
this.obj1 = obj1;
}
public Object getObj2() {
return obj2;
}
public void setObj2(Object obj2) {
this.obj2 = obj2;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
70797 次 |
最近记录: |