lim*_*imc 14 xml spring spring-mvc jaxb
我在尝试设置@ResponseBody以返回集合时遇到问题.我在类路径中有JAXB jar,我没有设置任何ContentNegotiatingViewResolver.
这是我的简单对象: -
@XmlRootElement(name = "test-object")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestObject implements Serializable {
@XmlAttribute
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
Run Code Online (Sandbox Code Playgroud)
我写了一个简单的测试,它返回一个对象...这没有问题,我能够看到生成的XML: -
@RequestMapping(value = "one", method = RequestMethod.GET)
public @ResponseBody TestObject getSingleObject() {
TestObject obj = new TestObject();
obj.setId(1);
return obj;
}
Run Code Online (Sandbox Code Playgroud)
我真正想要的是返回一个对象列表.阅读后,似乎这样做的方法是将列表放在地图中并返回地图: -
@RequestMapping(value = "all", method = RequestMethod.GET)
public @ResponseBody Map<String, ? extends Object> getAllObjects() {
TestObject obj1 = new TestObject();
obj1.setId(1);
TestObject obj2 = new TestObject();
obj2.setId(2);
List<TestObject> list = Arrays.asList(obj1, obj2);
return Collections.singletonMap("all-objects", list);
}
Run Code Online (Sandbox Code Playgroud)
当我执行上面的操作时,我得到"错误406不可接受".
我在这做错了什么?我正在Jetty 6.1上运行,如果这有所作为的话.
谢谢.
小智 10
您需要在pom.xml中添加这两个依赖项!
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-lgpl</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-lgpl</artifactId>
<version>1.8.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
小智 5
我遇到了同样的问题,经过几个小时的调试后我终于找到了解决方案.为了防止其他人遇到同样的问题,这就是我发现的.
您可能在Spring 3中遵循了Ajax Simplifications,它告诉您使用mvc:annotation-driven配置元素.
它没有告诉你的是mvc:annotation-driven只是定义几个标准bean的快捷方式,除非你已经定义了其中一个bean!
使用mvc:annotation-driven配置,MappingJacksonHttpMessageConverter在org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter上注册为messageConverter.
如果已定义自己的AnnotationMethodHandlerAdapter,则还应手动定义此MappingJacksonHttpMessageConverter.
不使用向AnnotationMethodHandlerAdapter注册的 Cfr Custom消息转换器,仅使用默认值.其中讨论了类似的问题.同时检查SPR-6524和SPR-6306,由于垃圾邮件的预防,无法发布链接:(
我的spring配置中的相关部分最终看起来像这样:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="validator">
<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
</bean>
</property>
</bean>
</property>
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
<bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter"/>
<bean class="org.springframework.http.converter.feed.RssChannelHttpMessageConverter"/>
</list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
小智 0
更多的是建议而不是答案,但是您是否尝试过创建地图,然后添加对象,然后像这样返回地图?
@RequestMapping(value = "all", method = RequestMethod.GET)
public @ResponseBody Map<String, ? extends Object> getAllObjects() {
TestObject obj1 = new TestObject();
obj1.setId(1);
TestObject obj2 = new TestObject();
obj2.setId(2);
List<TestObject> list = Arrays.asList(obj1, obj2);
Map<String, Object> map = new TreeMap<String, Object>();
map.put("all-objects",list);
return map;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15274 次 |
| 最近记录: |