当前位置: 首页 > 知识库问答 >
问题:

点注释后的Spring路径变量截断

吕英豪
2023-03-14

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

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="useDefaultSuffixPattern" value="false" />
</bean>
@RequestMapping(value = "user/by-email/{email:.+}")

共有1个答案

姜育
2023-03-14

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

第一个(可以使用{email:.+}regex修复)是默认Spring配置匹配所有路径扩展。因此,为/api/{file}设置映射意味着Spring将对/api/myfile.html的调用映射到字符串参数myfile。当您希望/api/myfile.html/api/myfile.md/api/myfile.txt和其他文件都指向同一个资源时,这很有用。但是,我们可以在全局范围内关闭这种行为,而不必在每个endpoint上使用regex hack。

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

我们可以通过以下操作将两者关闭(假设是Spring引导):

@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:没有@PathVariable 方法3:只使用path和@PathVariable的RequestMapping 方法4:RequestMapping只使用path而不使用@PathVariable 路径变量支持 @PathVariable问题 问题是,我们可以将作为方法参数来访问,但是当我们试图在中指定它时,在上述情况下,执行并没有到达我们的控制器,我们得到了上述相同的异常。有人帮忙吗?

  • 我正在尝试使用PathVariable创建一个包含Hello和name user的简单页面。如果你来的话http://localhost:8080/#/John你会在网站上看到“你好,约翰”。 我知道好Java,但在AngularJS我是初学者。 Hello控制器 HelloController在角 app.js 简单的页面hello/布局。html 谢谢你的帮助!

  • 问题内容: 我有一个非常简单的Spring WebSocket应用程序。但是,我正在尝试使用路径变量进行订阅以及消息映射。 我在下面发布了一个释义的示例。我希望注解会根据订阅者的身份返回给订阅者。即,to 应通知的订阅者,但我没有看到此行为。 值得注意的是,订阅文字作品。这是故意的吗?我是否缺少某些配置?还是这不是它的工作方式? 我对WebSockets或这个Spring项目还不太熟悉,所以在此先

  • 问题内容: 我需要有关通过变量将XML路径传递给nodes()方法的帮助。我看了几篇不同的文章,发现可以使用和传递节点。下面的示例按预期工作: 但是,当我尝试传递路径而不是单个节点时,它不起作用: 我需要能够在始终为常数的路径的另一部分之前传递路径。因此,在我的示例中,“测试”部分将始终相同,但其上方的路径将有所不同。 我怀疑这不是这样做的方法。但是,有其他方法可以做到这一点吗? 任何帮助,将不胜

  • 经过在internet上的搜索,我知道了在交互式/非交互式-登录/非登录shell组合的情况下应该在哪里更改PATH变量的值。 从另一个帖子中找到的 我有“/bin/sh”作为缺省登录shell,只有/etc/profile文件用于导出系统中所有需要的环境变量。在非交互式登录shell的情况下,/etc/profile也不会被引用,尽管上面的link说它会被引用。但当我执行时, 我可以看到PATH