Spring MVC error: ресурс, указанный в этом запросе, способен генерировать только ответы - PullRequest
2 голосов
/ 11 февраля 2012

Когда я вызываю этот URL в браузере:

http://localhost:8080/app/foo.json

Spring отвечает 406 кодом состояния в этом сообщении об ошибке:

Ресурс, указанный в этом запросе, способен толькогенерации ответов с характеристиками, не приемлемыми в соответствии с запросом "accept" headers ().

Однако я определил свой преобразователь представления согласования содержимого следующим образом:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="favorPathExtension" value="true" />
    <property name="ignoreAcceptHeader" value="true" />

    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json"/>
            <entry key="html" value="text/html"/>
        </map>
    </property>
</bean>

И мойКонтроллер определяется так:

@Controller
@RequestMapping(value = "/foo")
public class ToowootController {

    @RequestMapping(method = GET)
    @ResponseBody
    public FooDTO index() {
        // return fooDTO
    }

}

Есть идеи, что я делаю не так?

Ответы [ 5 ]

10 голосов
/ 12 февраля 2012

Похоже, проблема была в том, что я не добавил все необходимые зависимости, в данном случае jackson-mapper-asl. Я думал, что только добавления jackson-core-asl будет достаточно.

2 голосов
/ 14 февраля 2012

@ ResponseBody и ContentNegotiatingViewResolver - две альтернативы для одной и той же вещи. Вы обычно используете один или другой, а не оба. Удалите @ResponseBody, если вы хотите использовать ContentNegotiatingViewResolver.

0 голосов
/ 28 февраля 2013

ContentNegotiationManager решает эту проблему. Я использую пружину 3.2. Я уже ответил, это работает для меня, особенно для .json, отметьте здесь .

0 голосов
/ 11 февраля 2012

Когда вы используете свой веб-сайт для ContentNegotiatingViewResolver ModelAndViews контроллеров возврата или просмотра имен , и ContentNegotiatingViewResolver будет на основе различных критериев выбирать правильную стратегию представления данных .

Поэтому вы можете не только вернуть объект DTO.

Пример конфигурации

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="order" value="1" />
   <property name="mediaTypes">
    <map>
      <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"            />
    </list>
  </property>
 <property name="ignoreAcceptHeader" value="true" />
</bean>


@Controller
@RequestMapping(value = "/foo")
public class ToowootController {

    @RequestMapping(method = GET)
    @ResponseBody
    public ModelAndView index() {

        return new ModelAndView("xxxx", "Foo", FooDTO);
    }
 }

Расширение сообщит Spring тип контента, который будет использоваться при возврате данных.

0 голосов
/ 11 февраля 2012

Я не уверен, что это исправит это, но я вижу проблему с вашим кодом.Примечание @ResponseBody должно предшествовать возвращенному элементу, в данном случае FooDTO.Также я надеюсь, что вы статически импортировали «RequestMethod.GET».В противном случае вы должны изменить «GET» на «RequestMethod.GET».Таким образом, метод должен читать:

@RequestMapping(method = RequestMethod.GET)
    public @ResponseBody FooDTO index() {
        // return fooDTO
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...