我转换为控制器使用ContentNegotiatingViewResolver而不是MessageConverters来支持多种输出类型。使用json,我使用MappingJacksonJsonView:
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1" />
<property name="mediaTypes">
<map>
<entry key="html" value="text/html"/>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</map>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean class="org.springframework.oxm.xstream.XStreamMarshaller" />
</constructor-arg>
</bean>
</list>
</property>
<property name="ignoreAcceptHeader" value="true" />
<property name="defaultContentType" value="application/json" />
</bean>
使用以下控制器逻辑:
@RequestMapping(value = "/id/{id}", method = RequestMethod.GET)
public ModelAndView getById(@PathVariable (value="id") String id) {
MyObject ret = doGetById(id);
ModelAndView modelAndView = new ModelAndView("common/single");
modelAndView.addObject("myObject", ret);
return modelAndView;
}
当我访问/id/1234.json时,json返回类似于:
{
myObject: {
field1:"abc",
field2:"efg"
}
}
我有没有办法将myObject设置为结果的顶级节点,所以它看起来像这样:
{
field1:"abc",
field2:"efg"
}
答案 0 :(得分:8)
正在发生的事情是Spring MVC正在使用ModelAndView并将其序列化为JSON。由于ModelAndView看起来就像一张地图,在这种情况下,地图中只有一个条目,其名称为myObject,这就是JSON响应所看到的内容。为了获得你的对象,你需要只返回你的对象而不是ModelAndView,让Jackson将你的对象序列化为JSON。
返回MyObject并使用@ResponseBody
注释方法,而不是返回ModelAndView,因此您的控制器方法变为
@RequestMapping(value="/id/{id}", method=RequestMethod.GET, produces="application/json")
public @ResponeBody MyObject getById(@PathVariable (value="id") String id) {
return doGetById(id);
}
答案 1 :(得分:2)
我遇到了同样的问题,以下解决方案适合我。
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="prefixJson" value="true" />
</bean>
答案 2 :(得分:2)
您应该可以使用MappingJacksonJsonView.setExtractValueFromSingleKeyModel(true)
删除外部节点:
设置是否将包含单个属性的模型序列化为地图 或者是否从模型中提取单个值并将其序列化 直接
设置此标志的效果类似于使用 使用@ResponseBody MappingJacksonHttpMessageConverter 请求处理方法。
例如:
private final MappingJacksonJsonView view = new MappingJacksonJsonView();
public MyController() {
view.setExtractValueFromSingleKeyModel(true);
}
@RequestMapping(value = "/id/{id}", method = RequestMethod.GET)
public ModelAndView getById(@PathVariable (value="id") String id) {
MyObject ret = doGetById(id);
ModelAndView modelAndView = new ModelAndView();
modelAndView.setView(this.view);
modelAndView.addObject("myObject", ret);
return modelAndView;
}
如果您希望通过配置进行此操作,这也应该有效:
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="extractValueFromSingleKeyModel" value="true" />
</bean>