我知道spring有三种策略来确定请求的内容并返回相应的类型。和春天使用这三种策略来检测。
我可以重新排序这些弹簧会先检查Accept Header吗?喜欢
答案 0 :(得分:1)
为此,您需要自定义ContentNegotiationManager
。默认ContentNegotiationManagerFactoryBean
具有固定的策略顺序,并建议您在自定义订单时实例化ContentNegotiationManager
,就像
new ContentNegotiationManager(strategies);
其中strategies
是按正确顺序排列的策略列表。
但我相信扩展ContentNegotiationManagerFactoryBean
只是覆盖创建和订购策略的afterPropertiesSet
方法更容易。
public class MyCustomContentNegotiationManagerFactoryBean extends ContentNegotiationManagerFactoryBean {
@Override
public void afterPropertiesSet() {
List<ContentNegotiationStrategy> strategies = new ArrayList<ContentNegotiationStrategy>();
if (!this.ignoreAcceptHeader) {
strategies.add(new HeaderContentNegotiationStrategy());
}
if (this.favorPathExtension) {
PathExtensionContentNegotiationStrategy strategy;
if (this.servletContext != null && !isUseJafTurnedOff()) {
strategy = new ServletPathExtensionContentNegotiationStrategy(
this.servletContext, this.mediaTypes);
}
else {
strategy = new PathExtensionContentNegotiationStrategy(this.mediaTypes);
}
strategy.setIgnoreUnknownExtensions(this.ignoreUnknownPathExtensions);
if (this.useJaf != null) {
strategy.setUseJaf(this.useJaf);
}
strategies.add(strategy);
}
if (this.favorParameter) {
ParameterContentNegotiationStrategy strategy =
new ParameterContentNegotiationStrategy(this.mediaTypes);
strategy.setParameterName(this.parameterName);
strategies.add(strategy);
}
if (this.defaultNegotiationStrategy != null) {
strategies.add(this.defaultNegotiationStrategy);
}
this.contentNegotiationManager = new ContentNegotiationManager(strategies);
}
}
然后您可以在弹簧配置中使用此工厂bean:
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
<bean id="contentNegotiationManager" class="com.yourcompany.MyCustomContentNegotiationManagerFactoryBean"/>
要在基于注释的配置中配置ContentNegotiationManager
,请删除@EnableWebMvc
注释并使用您的配置类扩展WebMvcConfigurationSupport
或DelegatingWebMvcConfiguration
。然后,您要覆盖WebMvcConfigurationSupport
的{{3}}。该方法负责ContentNegotiationManager
的实例化。
不要忘记添加@Bean
注释来覆盖方法。