[spring-projects/spring-boot]直接在 Jersey 中支持 WebJars

2017-12-14 983 views
3

这是一半问题和一半(潜在的)错误报告。我询问了项目中的问题webjars-locator并被引导到这里。

我正在尝试swagger-ui在 Spring Boot 中使用 Jersey 和 Tomcat 以与版本无关的方式工作。根据WebJars 文档,具有pom.xml类似于以下内容的内容应该允许我swagger-ui通过http://localhost:8080/webjars/swagger-ui/进行访问,但它只能通过http://localhost:8080/webjars/swagger-ui/进行访问/3.6.1 .

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jersey</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </dependency>
    <dependency>
      <groupId>org.webjars</groupId>
      <artifactId>swagger-ui</artifactId>
      <version>3.6.1</version>
    </dependency>
    <dependency>
      <groupId>org.webjars</groupId>
      <artifactId>webjars-locator</artifactId>
      <version>0.32-1</version>
    </dependency>
</dependencies>

webjars-locator在这种情况下我需要做什么特别的事情才能开始工作吗?它工作得很好,spring-boot-starter-web这让我相信这可能是一个错误。

回答

8

Spring MVC 支持是通过org.springframework.web.servlet.resource.WebJarsResourceResolverSpring 框架提供的,Spring Boot 免费获取它。

我们目前没有对 Jersey 提供相同类型的支持。

7

@jessemellar @philwebb 我可以为此做出贡献吗?

9

@marti1125 我不能很快做出贡献。我当然不是项目维护者,但这个ideal-for-contribution标签让我认为他们会接受你的 PR。 :)

2

@marti1125 是的,非常欢迎。

2

我已在 Spring Boot 2.0.0.RC1 和 swagger-ui 3.9.3 中尝试过此操作 - 无法重现该问题。解决了吗?

2

@Butorchin-Dmitri 我们不知道; Boot 中没有任何改变来支持这一点。您能分享一下您的应用程序吗?

8

@Butorchin-Dmitri 您是否尝试使用 Jersey 而不是默认的 Spring Boot 容器?我可以制作一个快速演示来展示今天的问题。

编辑:我忘记了我的团队已经不再使用 Spring Boot 来完成这个特定的项目,这意味着我不再有一个代码库来快速制作演示。也许 @Butorchin-Dmitri 的新应用程序正在按预期运行。

9

我已经成功在git repo中复制了一些问题。重现说明位于自述文件中。

我对此进行了一些分析,并希望帮助解决。

正如 @philwebb 提到的,webjars 功能正在由org.springframework.web.servlet.resource.WebJarsResourceResolver.不幸的是,这是在 spring-mvc 项目中,并利用了 Spring-jersey 用户无法使用的 ResourceResolver 机制。

我想到了几个选择

  1. 允许 servlet 3.0 约定静态提供 webjar
  2. 带有 /webjars/.* 正则表达式的 Jersey 控制器来提供内容
  3. 具有相同功能的 servlet/filter

从各方面来看,Servlet 3.0 应该为META-INF/resources目录中的静态文件提供服务。 webjars文档是这样解释的。我就是无法让它发挥作用。尝试添加 Tomcat DefaultServlet 并将 Jersey 设置为过滤器,但没有任何乐趣。

有人可以引导我走向正确的方向吗?

9

嗯,这是一个开始!根据规范,这是我所期望的行为。也许我可以创建一个 servlet 过滤器,使用 webjars-locator 进行重定向

9

@Butorchin-Dmitri 2.0.0.RC1 最初确实工作,但是当您实际添加 JerseyConfig 时(任何人都需要这样做),JerseyAutoConfig 就会启动,并且 JerseyServlet 会被注册,从而阻止对 webjar 的请求。

因此,使其再次正常工作的技巧是将 Jersey 注册为 Filter(默认为 Servlet)并打开“forwardOn404”。这使得 webjar 再次工作。

为了使 Jersey 的内容与 spring-web 保持一致,我编写了一个 Filter 来使用 WebJars 定位器有条件地重定向请求。

这是在同一个仓库中,我没有提出拉取请求,因为我希望有人首先说这是可行的方法。

注意事项:

  1. 此更改将更改 Jersey 作为过滤器的默认注册:这是一个问题吗?
  2. 使用 Filter 将http://localhost:8080/webjars/bootstrap/css/bootstrap.css重定向到http://localhost:8080/webjars/bootstrap/3.1.0/css/bootstrap.css 的行为并不完全相同作为 spring-web 方式。这是一个http重定向,有问题吗?也许它应该在内部做一个servlet转发?

@philwebb 你有小牛吗?

7

@w4tson我尝试使用您的WebJarsFilter.java,但它在我的应用程序中引发了异常:

java.lang.IllegalArgumentException:找不到 swagger-ui/index.html。确保您已添加相应的 WebJar 并检查是否有拼写错误。

2

@philwebb 这个问题仍然相关并且是理想的贡献吗?

3

@govi20 是的,我认为它仍然与泽西岛用户相关。

1

虽然这个功能对 Jersey 用户很有用,但我认为我们无法在 Spring Boot 中真正正确地解决这个问题。 Spring 框架在资源处理功能的上下文中支持 WebJars,支持静态资源服务、缓存清除、HTTP 缓存标头等。

一旦 Jersey 正式支持,Spring Boot 应该自动配置此功能。暂时关闭此问题,一旦在泽西岛可用,我们应该重新打开它。