2010-01-13 2 views
2

Я читал Spring 3.0 Documentation и Blog Posts (followups) о том, как создать службы стиля REST с помощью Spring MVC, но я не могу найти какой-либо рабочий пример о том, как использовать ContentNegotiationViewResolver. У меня есть тестовый контроллер, как этотЕсть ли пример использования Spring 3.0 для ведения контента для служб RESTful?

@Controller 
public class IndexController implements Serializable 
{ 
    @RequestMapping("/index") 
    public ModelAndView index() 
    { 
     ModelAndView mav = new ModelAndView(); 
     mav.setViewName("index"); 
     return mav; 
    } 
} 

и пытались использовать что-то вроде этого

<bean 
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="mediaTypes"> 
     <map> 
      <entry key="html" value="text/html" /> 
      <entry key="xml" value="text/xml" /> 
      <!-- 
       <entry key="json" value="application/json"/> 
      --> 
     </map> 
    </property> 
    <property name="defaultContentType"><value>text/html</value></property> 
    <property name="defaultViews"> 
     <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 
      <property name="marshaller"> 
       <bean class="org.springframework.oxm.xstream.XStreamMarshaller" /> 
      </property> 
     </bean> 
    </property> 
    <property name="viewResolvers"> 
     <list> 
      <bean 
       class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
       <property name="prefix" value="/WEB-INF/views/pages/" /> 
       <property name="suffix" value=".jsp" /> 
      </bean> 
     </list> 
    </property> 
</bean> 

пытается решить точку зрения в соответствии с расширением в URL (Я хочу поддержать HTML, XML и .json). Представление .html работает (также показывает правильное представление JSP), но ничто другое, что я пытался использовать для запуска JSON и XML, похоже, не работает (настройка свойства defaultViews была всего лишь одной из вещей, которые я пробовал). Кажется, что не так много читающего материала. Есть ли у кого-нибудь опыт или примеры?

ответ

2

Я считаю, что проблема заключается в том, что контент-тип XML не text/xml, это application/xml. Вы обнаружите, что MarshallingView не примет тип контента text/xml.

Что касается ContentNegotiatingViewResolver, то проконсультируется с каждым из его видов, спросив их, согласятся ли они с типом контента, который был разрешен из запроса. Для каждого типа контента, который вы хотите поддерживать, вам нужно представление с соответствующим свойством contentType.

Вы можете либо изменить тип содержимого в mediaTypes собственности, или вы можете переопределить contentType свойство MarshallingView быть text/xml.

+0

Спасибо, тип содержимого был действительно неправильным, но теперь я получаю исключение, говорящее «Невозможно найти объект для сортировки в модели {}». Правильно ли настроен XML-маршаллер (я хотел настроить XStream для создания JSON тоже). – Daff

+0

@Daff Это потому, что ваша модель пуста – axtavt

+0

Действительно, вам нужно настроить свою модель, чтобы «MarshallingView» знал, что с этим делать. Это, однако, представляет собой совершенно другой вопрос, поэтому, пожалуйста, примите это, как описано, и переходите к следующему. – skaffman