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

Jersey 1.19的Swagger JAX-RS给出了“冲突的URI模板”错误

司空福
2023-03-14

我正在尝试将Swagger添加到使用Jersey 1.19的现有应用程序中。为了在应用程序中添加Swagger,我一直遵循以下指南:https://github.com/swagger-api/swagger-core/wiki/Swagger-Core-Jersey-1.X-Project-Setup-1.5.

在Apache Tomcat上部署应用程序时,出现以下错误:

SEVERE: Conflicting URI templates. The URI template / for root resource class io.swagger.jaxrs.listing.ApiListingResource and the URI template / transform to the same regular expression (/.*)?

奇怪的是,我的泽西servlet没有部署在根上下文中,而是部署在 /api/*上下文中,如web.xml文件所示:

<servlet>
    <servlet-name>MyApp Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>app.MyApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>MyApp Service</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

我的MyApplication类定义如下:

public class MyApplication extends Application {

private final Set<Object> singletons = new HashSet<Object>();
private final Set<Class<?>> classes = new HashSet<Class<?>>();

public MyApplication() {

    MyResource resource= new MyResource();

    singletons.addAll(Arrays.asList(resource));

    BeanConfig beanConfig = new BeanConfig();
    beanConfig.setBasePath("/api");
    beanConfig.setResourcePackage(getClass().getPackage().getName());
    beanConfig.setTitle("REST API");
    beanConfig.setVersion("1.0.0");
    beanConfig.setScan(true);

    classes.add(io.swagger.jaxrs.listing.ApiListingResource.class);
    classes.add(io.swagger.jaxrs.listing.SwaggerSerializers.class);
}

@Override
public Set<Class<?>> getClasses() {
    return classes;
}

@Override
public Set<Object> getSingletons() {
    return singletons;
}}

我尝试了其他配置,例如在web中定义Swagger servlet。xml文件,而不是使用BeanConfig,但仍然会发生相同的错误。我已经在另一个使用Jersey 2的项目中以这种方式工作,但不幸的是,当前项目必须保留在Jersey 1.19上。以下是pom中定义的招摇依赖项。xml文件:

<dependency>
  <groupId>io.swagger</groupId>
  <artifactId>swagger-jersey-jaxrs</artifactId>
  <version>1.5.0</version>
</dependency>

任何帮助将不胜感激。

共有1个答案

华知
2023-03-14

更新2:看起来swagger core的1.5.8版本修复了这个问题。有关详细信息,请参阅此提交。

更新:与其将招摇资源添加为子资源,不如只覆盖路径映射。有关详细信息,请参阅解决方案2。

我面临着完全相同的问题。原因是Swagger资源被映射到root@Path("/")公共类ApiListingResources

一种简单且不灵活的方法是不定义到根路径(“/”)的任何资源映射。

ApiListingResource应获得新的路径映射

package my.api.package.swagger

import javax.ws.rs.Path;

@Path("swagger")
public class ApiListingResource extends io.swagger.jaxrs.listing.ApiListingResource {}

SwaggerSerializers应该得到新包

package my.api.package.swagger;

import javax.ws.rs.ext.Provider;

@Provider
public class SwaggerSerializers extends io.swagger.jaxrs.listing.SwaggerSerializers {}

添加我的。应用程序编程接口。包裹昂首阔步,而不是io。大摇大摆jaxrs。在Swagger包配置中列出。

另一个解决方案是将Swagger移动到另一条路径,允许您的资源映射到您喜欢的任何地方。要实现这一点,您需要:

如果您将应用程序子类化:

public MyApplication() {
    //init BeanConfig
    //add your resource classes

    //classes.add(io.swagger.jaxrs.listing.ApiListingResource.class);
    classes.add(io.swagger.jaxrs.listing.SwaggerSerializers.class);
}

如果您通过web进行配置。xml使用com。太阳运动衫配置。所有物包param:

<servlet>
    <servlet-name>your-rest-api</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>
            {your_application_packages},
            <!--io.swagger.jaxrs.json,-->
            <!--io.swagger.jaxrs.listing-->
        </param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.classnames</param-name>
        <param-value>
            io.swagger.jaxrs.listing.SwaggerSerializers,
            io.swagger.jaxrs.json.JacksonJsonProvider
        </param-value>
    </init-param>
</servlet>

顺便说一下,我注意到GF3.1.2.2使用配置的泽西

@Path("/") 
class RootResource {
    @Context ServletContext context;

    @Path("/swagger")
    public ApiListingResource swagger() {
        return new ApiListingSubResource(context);
    }
}

由于ApiListingResources现在不是由jer管理的,所以它没有注入ServletContext。要克服这个问题,您必须将其作为构造函数参数传递,对于该子类ApiListingResources并提供正确的构造函数:

// context has 'default' visibility
// so we need to stay in the same package 
// to be able to access it
package io.swagger.jaxrs.listing;

import javax.servlet.ServletContext;

public class ApiListingSubResource extends ApiListingResource {
    public ApiListingSubResource(ServletContext sc) { this.context = sc; }
}

现在,您的招摇描述符将位于<代码>http://hostname/app-path/swagger/swagger.json,您仍然可以使用根资源。

这条路有点长,但是有用!希望能有所帮助。

 类似资料:
  • 我在摆弄弹力靴,但每向前走一步,就会让我后退两步。 我将我的简单应用程序与Springboot连接在一起,但我没有得到这个错误: 还有这一点: 我不用任何数据库。应用程序非常简单。下面是主要的类: 下面是其他两个类和: 就是这样。尽管它可能很简单。 下面是文件结构以及build.gradle文件内容: 能有人请帮助我让这个小程序运行,指出我在正确的方向,以解决这个问题? 事先好心谢谢你。

  • 问题内容: 我与golang html / template和angularjs分隔符冲突。我知道有一种方法可以更改Go中的定界符,但它对我不起作用。也许应该在解析文件之前调用它?您能否提供一个示例,说明应如何实施。 我发现很多评论认为AngularJS和Go应该没有任何冲突,因为它们应该分开使用。据我了解,Go应该仅用于后端(REST)。问题是,应如何加载AngularJS,HTML?在这种情况

  • 问题内容: 我想将AngularJS与Django一起使用,但是它们都用作模板标记。有没有一种简单的方法可以将两者之一更改为使用其他自定义模板标签? 问题答案: 对于Angular 1.0,你应该使用$ interpolateProvider api配置插值符号:http : //docs.angularjs.org/api/ng.$interpolateProvider。 这样的事情应该可以解决

  • 问题内容: 尝试在文件和URL之间进行转换时,我得到一些奇怪的行为,尤其是当文件/路径的名称中带有空格时。有没有在两者之间进行转换的安全方法? 我的程序具有文件保存功能,其中实际的“保存”操作委托给需要URL作为参数的外部库。但是,我也希望用户能够选择要保存到的文件。问题是,在文件和URL之间进行转换(使用URI)时,空格显示为“%20”,并弄乱了各种操作。考虑以下代码: 这将返回false(由于

  • 我正在尝试在TomEE服务器上运行我的应用程序,在经历了很多麻烦之后,我能够运行该应用程序。 然而,由于某种原因,我得到了某种类型的jar重新定位冲突,因此每当从应用程序调用重新定位资源类时都会出现如下错误 我验证了BuiltResponse类,该类扩展了resteasy jar中的响应类,它包含该方法似乎很好。我尝试提取许多其他jar,以便提供冲突。下面是我处理resteasy的POM的一部分

  • 如果我调用tomcat服务器的默认url,我将看到一个错误404。程序运行时没有任何问题,但restcontroller可能已禁用(我不知道,通常不知道)。日志中没有错误。起始页是html格式。我设置了默认路径(见下文)。 我正在使用Spring Boot和tomcat7。 请求的资源(/dashboard/)不可用。 Spring Boot路径src\main\resources\templat