是否有可能从子路径而不是应用上下文根提供svagger根?

时间:2018-11-19 14:10:28

标签: spring-boot jersey-2.0 swagger-2.0

我遵循了这个示例swagger configuration,但是无论我传递给{{1的是什么,但我都希望将swagger根(swagger.json的提供路径)设置为<jersey-context-root>/api-or-some-other-path }}粗大的根始终是application.yml文件中定义的j ersey应用上下文根,即config.setBasePath(some-sub-path);,因此看来 basePath 很难有线。

1 个答案:

答案 0 :(得分:1)

查看您的链接和代码

this.register(ApiListingResource.class);

ApiListingResource是为swagger.json端点服务的实际资源类。如果您查看链接,则可以看到该类带有路径注释({type:json|yaml}决定了将返回数据的类型)。

@Path("/swagger.{type:json|yaml}")

如果要更改路径,则需要进行其他注册。您需要做的是使用Resource.builder(ResourceClass)方法来获得一个构建器,我们可以在其中更改路径。例如,您可以执行以下操作。

Resource swaggerResource = Resource.builder(ApiListingResource.class)
        .path("foobar/swagger.{type:json|yaml}")
        .build();

然后使用ResourceConfig#register()方法代替ResourceConfig#registerResource(Resource)方法。

this.registerResource(swaggerResource);

这是使用Jersey Test Framework

的完整测试
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.model.Resource;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class ResourceBuilderTest extends JerseyTest {

    @Path("/swagger.{type:json|yaml}")
    public static class ApiListingResource {

        @GET
        @Produces("text/plain")
        public String get() {
            return "Hello World!";
        }
    }

    @Override
    public ResourceConfig configure() {
        Resource swaggerResource = Resource.builder(ApiListingResource.class)
                .path("foobar/swagger.{type:json|yaml}")
                .build();
        ResourceConfig config = new ResourceConfig();
        config.registerResources(swaggerResource);
        return config;
    }

    @Test
    public void testIt() {
        Response response = target("foobar/swagger.json")
                .request()
                .get();

        String data = response.readEntity(String.class);
        System.out.println(data);
        assertEquals("Hello World!", data);
    }
}