Здравствуйте, я хотел бы использовать 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>