我即将对我的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”,它就会很好用。
如何让它以更通用的方式运作?