弹簧 - 路径变量在点后截断 - 注释

我正在尝试设置一个 REST 终结点,该终结点允许按电子邮件地址查询用户。电子邮件地址是路径的最后一部分,因此Spring将其视为值并截断扩展名。foo@example.comfoo@example.com

我在这里发现了一个类似的问题 春季MVC @PathVariable点(.)被截断 但是,我有一个基于注释的配置 使用 和 .由于我没有xml配置,因此此解决方案不适合我:AbstractAnnotationConfigDispatcherServletInitializerWebMvcConfigurerAdapter

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="useDefaultSuffixPattern" value="false" />
</bean>

我也尝试过这个使用正则表达式的解决方案,但它也不起作用。

@RequestMapping(value = "user/by-email/{email:.+}")

有谁知道如何在没有xml的情况下关闭后缀模式截断?


答案 1

URI 末尾路径变量中的点会导致两种意外行为(对于大多数用户来说,这是意外的,但熟悉大量 Spring 配置属性的用户除外)。

第一个(可以使用正则表达式修复)是默认的Spring配置匹配所有路径扩展。因此,设置 映射将意味着Spring将调用映射到 String参数。当您希望 、 和其他 所有资源都指向同一资源时,这很有用。但是,我们可以全局关闭此行为,而不必在每个端点上诉诸正则表达式黑客攻击。{email:.+}/api/{file}/api/myfile.htmlmyfile/api/myfile.html/api/myfile.md/api/myfile.txt

第二个问题与第一个问题有关,并通过@masstroy正确修复。当指向资源时,Spring 假定路径扩展 (, 等) 指示应以特定格式返回资源。在某些情况下,此行为也非常有用。但通常,这意味着方法映射返回的对象无法转换为此格式,并且Spring将抛出./api/myfile.*myfile.html.txtHttpMediaTypeNotAcceptableException

我们可以通过以下方式关闭两者(假设Spring Boot):

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void configurePathMatch(PathMatchConfigurer configurer) {
    // turn off all suffix pattern matching
    configurer.setUseSuffixPatternMatch(false);
    // OR
    // turn on suffix pattern matching ONLY for suffixes
    // you explicitly register using
    // configureContentNegotiation(...)
    configurer.setUseRegisteredSuffixPatternMatch(true);
  }

  @Override
  public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false);
  }
}

有关内容协商的更多信息


答案 2

您必须在路径变量的末尾添加尾部斜杠,例如

 @RequestMapping(value ="/test/{name}/")

请求喜欢

http://localhost:8080/utooa/service/api/admin/test/Takeoff.Java@gmail.com/