Swagger альтернатива сканированию пакетов ресурсов - PullRequest
0 голосов
/ 18 июня 2020

Здравствуйте, я хотел бы использовать swagger-core для создания файла YAML / JSON для REST-API.

На локальном хосте обнаружение классов аннотированных ресурсов работает, но на сервере оно выиграло » t работает.

(сервер получает сгенерированный JAR в пакете OSGI)

Та же проблема уже возникала при использовании классов ресурсов JAX-RS, поэтому я переключился на метод класса «Application» для регистрации классов ресурсов вручную. Есть ли способ сделать то же самое для Swagger?

Ошибка сервера при выполнении запроса API следующая:

org.glassfish.jersey.server.internal.scanning.ResourceFinderException: The URI scheme bundleentry of the URI bundleentry://189.fwk1463867685/com/mypackage/Activator.class is not supported. Package scanning deployment is not supported for such URIs.
Try using a different deployment mechanism such as explicitly declaring root resource and provider classes using an extension of javax.ws.rs.core.Application
 at org.glassfish.jersey.server.internal.scanning.PackageNamesScanner.addResourceFinder(PackageNamesScanner.java:266)

В настоящее время запись выглядит так:

public class RestApplication extends Application {

    public RestApplication() {

        Properties prop = new Properties();
        BufferedReader input = null;

        try {
            input = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/config.properties")));
            prop.load(input);

            BeanConfig beanConfig = new BeanConfig();
            beanConfig.setVersion("1.0.2");
            beanConfig.setSchemes(new String[] { "http" });
            beanConfig.setHost(prop.getProperty("swagger_host"));
            beanConfig.setBasePath(prop.getProperty("swagger_api_basepath"));
            beanConfig.setResourcePackage("mypackage.api");
            beanConfig.setScan(true);

        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public Set<Class<?>> getClasses() {
        Set<Class<?>> s = new HashSet<Class<?>>();
        s.add(io.swagger.jaxrs.listing.ApiListingResource.class);
        s.add(io.swagger.jaxrs.listing.SwaggerSerializers.class);
        s.add(MyResource.class);
        return s;
    }
}

MyResource. java

@Api
@Path("test")
public class MyResource {

    public MyResource() {}

    @ApiOperation(value = "A test", response = MyModel.class, position = 0)
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getModel() {
        MyModel model = new MyModel();
        return Response.ok().entity(model).build();
    }

}

И для полноты картины приведен дескриптор развертывания (web. xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>API</display-name>

    <servlet>
        <servlet-name>Jersey REST API</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.mypackage.api.RestApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST API</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>

</web-app>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...