Spring MVC 3.1.1 ContentNegotiatingViewResolver - 如何在contentTypes中使用通配符?

时间:2012-08-09 09:26:01

标签: rest spring-mvc versioning content-negotiation media-type

我即将对我的REST Web服务进行版本控制,该服务基于ContentNegotiatingViewResolver,以便允许我返回XML,JSON以及HTML视图。

问题是,我既不能在MappingJacksonJsonView的contentType中使用通配符,也不能在xmlMarshallingView的contentType中使用,它们都是由ContentNegotiatingViewResolver引用的。 但我需要以通用方式定义这些contentTypes,因为我有几个mediaTypes(例如“application / vnd.springmvc3.sessionsinfo-v1 + xml”和application / vnd.springmvc3.sessionsinfo-v2 + xml“),并且同时似乎不可能为MappingJacksonJsonView / xmlMarshallingView声明几个contentTypes。

这是我的调度程序 - servlet的片段:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="order" value="1" />
  <property name="defaultViews">
    <list>
      <!-- JSON View -->
      <bean
    class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
        <property name="contentType" value="application/*+json" />
      </bean>
      <!-- JAXB XML View -->
      <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
      <property name="contentType" value="application/*+xml"/>
        <constructor-arg>
            <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
               <property name="classesToBeBound">
                <list>
                   <value>org.springmvc3.models.SessionInfo</value>
                </list>
               </property>
            </bean>
        </constructor-arg>
      </bean>
     </list>
  </property>
  <property name="ignoreAcceptHeader" value="false" />
  <property name="FavorPathExtension" value="false" /> 

我的控制器,例如生成mediaType“application / vnd.springmvc3.sessionsinfo-v1 + xml”:

@RequestMapping(method = RequestMethod.GET , produces = {"application/vnd.springmvc3.sessionsinfo-v1+json", "application/vnd.springmvc3.sessionsinfo-v1+xml"} )   
public ModelAndView showSessionsOverview(){

    SessionInfoService sessionInfoService = new SessionInfoService();
    SessionsInfo sessionsInfo = new SessionsInfo(sessionInfoService.getAllSessionInfoObjects());

    return new ModelAndView("all", "model",sessionsInfo);
}

现在我没有收到任何错误,但我既没有得到XML也没有JSON,即使我通过accept标头明确请求它。我只得到html,这就像我的配置中的后备策略。但是如果我写“application / vnd.springmvc3.sessionsinfo-v1 + xml”而不是“application / * + xml”,它就会很好用。

如何让它以更通用的方式运作?

0 个答案:

没有答案