Есть ли пример того, как использовать согласование содержимого Spring 3.0 для служб RESTful? - PullRequest
2 голосов
/ 13 января 2010

Я читал документацию Spring 3.0 и Посты блога (продолжение) о том, как создавать сервисы в стиле REST с помощью Spring MVC, но я не могу найти никакого рабочего примера о том, как используйте ContentNegotiatingViewResolver. У меня есть такой тестовый контроллер

@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 была лишь одной из тех вещей, которые я пробовал). Кажется, что не так много материала для чтения. У кого-нибудь есть опыт или примеры?

1 Ответ

2 голосов
/ 13 января 2010

Я полагаю, что ваша проблема в том, что тип содержимого XML не text/xml, а application/xml. Вы обнаружите, что MarshallingView не будет принимать тип контента text/xml.

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

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

...