【问题标题】:Swagger ReaderListener is never picked up during scanning扫描期间从不拾取 Swagger ReaderListener
【发布时间】:2016-10-04 15:40:48
【问题描述】:

我在与 Swagger 的资源类相同的包中实现了 ReaderListener。但是,当生成 Swagger 文件时,永远不会使用此类。我尝试将swagger.setBasePath("/empty"); 添加到afterScan() 只是为了查看它是否被调用,以检查它是否更改了基本路径,但它没有。关于我需要做些什么来确保在 Swagger 的扫描过程中获取该课程的任何想法?顺便说一句,我正在使用 Maven 构建项目并安装生成的 RPM(如果有影响的话)。

@io.swagger.annotations.SwaggerDefinition
public class SwaggerDefinition implements ReaderListener {
    @Override
    public void beforeScan(Reader reader, Scanner scanner) {
    }

    @Override
    public void afterScan(Reader reader, Scanner scanner) {
        final Model model = new ModelImpl()
            .name("EntryContainer")
            .type("Object")
            .required("entry")
            .property("entry", new ObjectProperty());
        model.setReference("#/definitions/entry");
        final Model model1 = new ModelImpl()
            .name("Entry")
            .type("Object")
            .property("first_name", new StringProperty())
            .property("last_name", new StringProperty())
            .required("first_name")
            .required("last_name");
        Map<String, Model> defs = new HashMap<>();
        definitions.put("EntryContainer", model);
        definitions.put("Entry", model1);
        swagger.setDefinitions(definitions);
    }
}

【问题讨论】:

  • 您找到解决方案了吗?我也有类似的问题。

标签: java swagger


【解决方案1】:

尽管这是一个老问题,但我还是想发布对我有用的东西。

这是我的 ReaderListener 实现。

import io.swagger.annotations.SwaggerDefinition;
import io.swagger.jaxrs.Reader;
import io.swagger.jaxrs.config.ReaderListener;
import io.swagger.models.Swagger;

@SwaggerDefinition
public class SwaggerBasePathModifier implements ReaderListener {
    @Override
    public void beforeScan(Reader reader, Swagger swagger) {

    }

    @Override
    public void afterScan(Reader reader, Swagger swagger) {
        // This is the purpose of my ReaderListener
        // Yours can be different
        swagger.setBasePath("/web-context/rest"); //<--set new base path
    }
}

在我的例子中,SwaggerBasePathModifier 类没有被 Swagger 扫描。为了解决这个问题,我必须在我的 rest 应用程序初始化时将其明确添加为要扫描的类之一。见代码中的 cmets。

classes.add(SwaggerBasePathModifier.class);

这是完整的课程

@ApplicationPath("rest")
public class MyRESTApp extends Application {
    public MyRESTApp() {
    }

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        // api end points
        classes.add(MyAPIResource.class);
        // swagger related
        classes.add(io.swagger.jaxrs.listing.ApiListingResource.class);
        classes.add(io.swagger.jaxrs.listing.SwaggerSerializers.class);
        classes.add(SwaggerBasePathModifier.class);//<-- This does the trick

        return classes;
    }
}

这帮助我解决了这个问题。希望这会有所帮助。

【讨论】:

  • 这是一个纯代码答案。希望您也解释一下答案。
  • @Sneha。我的代码中有 cmets 用于解释,但现在我在帖子中添加了描述。希望它可以帮助您了解修复并解决您的问题。
【解决方案2】:

我的是一个 Spring Bean,我用 @Component 进行了注释。确保此类正在由 Spring 或您可能正在使用的任何容器加载。

【讨论】:

    猜你喜欢
    • 2020-01-21
    • 2020-12-13
    • 2013-03-26
    • 1970-01-01
    • 2015-05-02
    • 2018-06-08
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多