Spring MVC @ResponseBody, возвращающий карту, производит "Ошибка 406 НЕ ПРИНИМАЕТСЯ"
У меня возникла проблема с настройкой @ResponseBody для возврата коллекции. У меня есть JAXB jars в пути к классам, и я не настроил ContentNegotiationViewResolver.
Это мой простой объект:
@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;
}
}
Я написал простой тест, который возвращает один объект... это работает без проблем, и я могу видеть сгенерированный XML: -
@RequestMapping(value = "one", method = RequestMethod.GET)
public @ResponseBody TestObject getSingleObject() {
TestObject obj = new TestObject();
obj.setId(1);
return obj;
}
Я действительно хочу вернуть список объектов. После прочтения кажется, что способ сделать это - поместить список на карту и вернуть карту: -
@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);
}
Когда я выполняю вышеописанное, я получаю сообщение "Ошибка 406 недопустимо".
Что я сделал здесь неправильно? Я работаю на Jetty 6.1, если это имеет значение.
Спасибо.
Ответы
Ответ 1
Вам нужны эти две зависимости, добавленные в 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>
Ответ 2
У меня была такая же проблема, и после нескольких часов отладки я наконец нашел решение. На всякий случай кто-то застрял с той же проблемой, вот что я нашел.
Вероятно, вы следовали за Ajax Simplifications в Spring 3, в котором говорится, что вы используете элемент конфигурации, управляемый аннотациями, с помощью mvc:
Что это не говорит вам, что mvc: annotation-driven - всего лишь ярлык для определения пары стандартных beans, если у вас уже нет одного из этих beans!
С конфигурацией mvc: с аннотацией MappingJacksonHttpMessageConverter регистрируется как messageConverter на org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.
Если вы определили свой собственный AnnotationMethodHandlerAdapter, вы также должны вручную определить этот MappingJacksonHttpMessageConverter.
Cfr Пользовательские конвертеры сообщений, зарегистрированные в AnnotationMethodHandlerAdapter, не используются, используются только те, которые используются по умолчанию., в котором рассматривается аналогичная проблема.
Также проверьте 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>
Ответ 3
Я знаю, что этот вопрос немного устарел, но у меня была та же проблема.
Я решил добавить для сборки путь к двум банкам: jackson-core-asl-1.x.jar
и jackson-mapper-asl-1.x.jar
. Вы можете скачать их здесь: http://wiki.fasterxml.com/JacksonDownload, или если вы используете Maven, вы можете добавить их как зависимость проекта.
Обратите внимание, что я использовал версию 1.x (1.9, в моем случае), а не 2.x. Последняя версия не работает для меня.
Ответ 4
Больше предложения, чем ответа, но попытались ли вы создать карту, а затем добавить объект, а затем просто вернуть карту следующим образом?
@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;
}