Можно ли обслуживать корень чванства из подпути в противоположность корню контекста приложения? - PullRequest
0 голосов
/ 19 ноября 2018

Я последовал этому примеру конфигурация swagger , но хотел бы установить корень swagger (путь, по которому подается swagger.json) на <jersey-context-root>/api-or-some-other-path за исключением того, что независимо от того, что я передаю config.setBasePath(some-sub-path); корень сваггера всегда является корнем контекста приложения j ersey , определенным в файле application.yml, то есть: spring.jersey.application-path, поэтому кажется, что basePath имеет аппаратную привязку.

1 Ответ

0 голосов
/ 19 ноября 2018

Посмотрите на вашу ссылку и код

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);
    }
}
...