gpt4 book ai didi

java - 你能重新排序 Spring MVC 用来确定请求内容的三种策略吗

转载 作者:行者123 更新时间:2023-11-30 10:42:25 25 4
gpt4 key购买 nike

我知道spring有3种策略来判断请求的内容并返回对应的类型。而spring使用这三种策略来检测。这是

  1. PathExtension(url 中的文件扩展名)
  2. 路径参数
  3. 接受 header

我可以重新排序这些以便 spring 将首先检查 Accept Header 吗?喜欢

  1. 接受 header
  2. 路径扩展
  3. 路径参数

最佳答案

为此,您需要自定义 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);
}
}

然后你可以在你的spring配置中使用这个工厂bean:

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
<bean id="contentNegotiationManager" class="com.yourcompany.MyCustomContentNegotiationManagerFactoryBean"/>

基于注解的配置

为了在基于注解的配置中配置ContentNegotiationManager,移除@EnableWebMvc注解并扩展WebMvcConfigurationSupportDelegatingWebMvcConfiguration 与您的配置类。然后你想覆盖 mvcContentNegotiationManager method WebMvcConfigurationSupport。该方法负责 ContentNegotiationManager 的实例化。

不要忘记将 @Bean 注解添加到覆盖的方法中。

关于java - 你能重新排序 Spring MVC 用来确定请求内容的三种策略吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38147215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com