java 我们可以从swagger文档中删除或隐藏路径元素吗?

icomxhvb  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(195)

我的公共API由我的主Web应用程序提供,但在不同的域上。为了使路径不与我的正常webapp路径冲突,公共API端点有一个隐藏的前缀。也就是说,当有人访问https://api.example.com/foo时,他们会在内部转发到/publicApi/foo;对https://www.example.com/foo的请求被正常处理。
当然,这意味着我的API的JAX-RS类都是这样注解的:

@Path("/publicApi")
public class PublicApiFooResource {
    @Path("/foo")
    public Foo getFoo() {...}
}

使用swagger-jaxrs2(v2.2.7),这会生成一个包含/publicApi的openapi文档:

paths: {
    /publicApi/foo: {
        get: { ... } etc

我怎样才能让swagger-jaxrs 2忽略路径中隐藏的前导部分?从世界的Angular 来看,路径是/foo;内部转发不会泄露到文档中。

kh212irz

kh212irz1#

这似乎是一个平庸的解决方案,似乎是一个常见的问题,但它确实有效。在swagger配置中启用此filterClass

package com.example;

import io.swagger.v3.core.filter.AbstractSpecFilter;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.PathItem;
import io.swagger.v3.oas.models.Paths;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;

public class PathSpecFilter extends AbstractSpecFilter {
    private static final String PUBLIC_PATH = "/thePublicApiPrefix";

    @Override
    public Optional<OpenAPI> filterOpenAPI(final OpenAPI openAPI, final Map<String, List<String>> params, final Map<String, String> cookies, final Map<String, List<String>> headers) {
        final Optional<OpenAPI> opt = super.filterOpenAPI(openAPI, params, cookies, headers);
        return opt.map(openapi -> {
            openapi.setPaths(fix(openapi.getPaths()));
            return openapi;
        });
    }

    private Paths fix(final Paths paths) {
        final Paths next = new Paths();

        for (final Entry<String, PathItem> entry : paths.entrySet()) {
            final String key = entry.getKey().startsWith(PUBLIC_PATH)
                    ? entry.getKey().substring(PUBLIC_PATH.length())
                    : entry.getKey();
            next.put(key, entry.getValue());
        }

        return next;
    }
}

相关问题