如何应用Spring 5中引入的PathPatternParser?

dgtucam1  于 2023-06-28  发布在  Spring
关注(0)|答案(3)|浏览(306)

我想创建一个以filepath作为路径变量的GET请求。
正如Spring文档中所描述的那样,here,这应该可以通过使用以下内容来实现:/resources/{*path}。
我使用的是Sping Boot 2.1.2,它使用Spring 5。
然而,当我像这样设置控制器方法时,请求与路由不匹配。例如,预期的匹配路径是/resources/some/filepath,它应该将PathVariable“path”引导为/some/filepath

@GetMapping("/resources/{*path}")
  public String content(@PathVariable String path) {
    return null;
  }

我没有找到关于使用新PathPattern所需的任何配置的任何信息。关于这个新特性,我发现的唯一其他信息是Baeldung(https://www.baeldung.com/spring-5-mvc-url-matching)上的一篇文章,其中没有提到任何关于配置的内容。所以我希望它能开箱即用,但事实并非如此。
我克隆了Baeldung帖子中提到的项目。相应的单元测试运行。当我将Controller方法和单元测试复制到我的项目时,它会失败。所以我认为这与配置有关。
谢谢你的帮助。

vjhs03f7

vjhs03f71#

在Spring文档中的Common Application属性中,有一个名为spring.mvc.pathmatch.matching-strategy的属性,用作“Choice of strategy for matching request paths to registered mappings”。
默认值(到目前为止)是ant-path-matcher,由于您想使用PathPattern,您需要在www.example.com文件中写入以下application.properties内容:
matching-strategy =路径模式解析器

1l5u6lss

1l5u6lss2#

我终于找到了我的问题的原因。
感谢Fabien的链接。
AntPathMatcher是PathMatcher的默认实现。1.10.12. Path Matching展示了如何配置PathMatcher。但是PathMatchConfigurer::setPathMatcher需要一个PathMatcher作为参数,AntPathMatcher是PathMatcher的唯一实现,所以你不能在那里设置PathPattern

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer
            .setUseSuffixPatternMatch(true)
            .setUseTrailingSlashMatch(false)
            .setUseRegisteredSuffixPatternMatch(true)
            .setPathMatcher(antPathMatcher())
            .setUrlPathHelper(urlPathHelper())
            .addPathPrefix("/api",
                    HandlerTypePredicate.forAnnotation(RestController.class));
    }

    @Bean
    public UrlPathHelper urlPathHelper() {
        //...
    }

    @Bean
    public PathMatcher antPathMatcher() {
        //...
    }

}

我在Baeldung项目中找到PathPattern的唯一类如下:

@Configuration
public class CorsWebFilterConfig {

    @Bean
    CorsWebFilter corsWebFilter() {
        CorsConfiguration corsConfig = new CorsConfiguration();
        corsConfig.setAllowedOrigins(Arrays.asList("http://allowed-origin.com"));
        corsConfig.setMaxAge(8000L);
        corsConfig.addAllowedMethod("PUT");
        corsConfig.addAllowedHeader("Baeldung-Allowed");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", corsConfig);

        return new CorsWebFilter(source);
    }

}
tzcvj98z

tzcvj98z3#

Enmanuel Rodríguez Paz给出了good declarative solution here
你也可以配置Spring 5.3强制使用PathPatternParser,如下所示:

package com.stackoverflow.users.pyb.questions.55457184;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.util.pattern.PathPatternParser;

public class WebConfig implements WebMvcConfigurer {

  @Override
  public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer
        .setPatternParser(new PathPatternParser());
  }
}

相关问题