Spring MVC @ResponseBody, возвращающий карту, выдает «Ошибка 406 НЕ ПРИНИМАЕТСЯ» - PullRequest
14 голосов
/ 07 сентября 2011

У меня проблема с попыткой настроить @ResponseBody для возврата коллекции. У меня есть JAXB-файлы в пути к классам, и я не настроил никакой 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;
    }
}

Я написал простой тест, который возвращает один объект ... это работает без проблем, и я могу увидеть сгенерированный 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, если это имеет значение.

Спасибо.

Ответы [ 4 ]

10 голосов
/ 20 октября 2011

Вам нужны эти две зависимости, добавленные в 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>
5 голосов
/ 04 апреля 2012

У меня была такая же проблема, и после пары часов отладки я наконец нашел решение. Просто на тот случай, если кто-то застрянет с той же проблемой, вот что я нашел.

Вы, вероятно, выполнили Упрощение Ajax в Spring 3 , которое говорит вам об использовании элемента конфигурации, управляемого mvc: annotation.

Что вам не нужно сказать, так это то, что mvc: annotation-based это просто ярлык для определения пары стандартных bean-компонентов, если у вас уже не определен один из этих bean-компонентов!

В конфигурации, управляемой mvc: annotation, MappingJacksonHttpMessageConverter зарегистрирован как конвертер сообщений на org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.

Если вы определили свой собственный AnnotationMethodHandlerAdapter, вам также следует вручную определить этот MappingJacksonHttpMessageConverter.

Cfr Пользовательские конвертеры сообщений, зарегистрированные в AnnotationMethodHandlerAdapter, не используются, используются только стандартные. , где обсуждается аналогичная проблема. Также проверьте SPR-6524 и SPR-6306, не можете публиковать ссылки из-за предотвращения спама: (

Соответствующая часть в моем весеннем конфиге выглядела так:

    <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>
2 голосов
/ 15 мая 2012

Я знаю, что этот вопрос немного устарел, но у меня возникла та же проблема.

Я решил добавить в путь компоновки две банки: jackson-core-asl-1.x.jar и jackson-mapper-asl-1.x.jar.Вы можете скачать их отсюда: http://wiki.fasterxml.com/JacksonDownload или, если вы используете Maven, вы можете добавить их как зависимость от Projet.

Обратите внимание, что я использовал версию 1.x (1.9, вмой случай) а не 2.х.Последняя версия не работает для меня.

0 голосов
/ 07 сентября 2011

Больше предложений, чем ответа, но вы пытались создать карту, а затем добавить объект, а затем просто вернуть карту, как эта?

@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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...