Java Swagger resteasy类加载器问题

Java Swagger resteasy类加载器问题,java,tomcat,classloader,swagger,resteasy,Java,Tomcat,Classloader,Swagger,Resteasy,我正在大摇大摆地记录一个rest服务。在构建和部署之后,我得到了一个json,它缺少标记(在我的例子中,“标记”:[“数据库”]丢失),并且完全忽略了webservice接口方法参数上的注释(仅正确提供了参数和其他文档)。它不列出参数,而是包含以下内容: "parameters" : [{ "in" : "body", "name" : "body", "required" :

我正在大摇大摆地记录一个rest服务。在构建和部署之后,我得到了一个json,它缺少标记(在我的例子中,
“标记”:[“数据库”]
丢失),并且完全忽略了webservice接口方法参数上的注释(仅正确提供了参数和其他文档)。它不列出参数,而是包含以下内容:

"parameters" : [{
                    "in" : "body",
                    "name" : "body",
                    "required" : false,
                    "schema" : {
                        "type" : "string"
                    }
                }
            ]
它很可能与配置或加载webapplication的过程有关,因为在使用tomcat manager webapp重新加载webapplication之后,它会发送正确的json

EDIT:简单地停止和重新启动应用程序具有相同的效果。此外,重新加载或重新启动后的json不是确定性的(随机的)。这意味着问题应该出在类加载器上。

我使用的是ApacheTomcat版本8.0.33,resteasy版本是
3.0.14。最终版本是
,招摇过市的是:

<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-jaxrs</artifactId>
    <version>1.5.8</version>
</dependency>
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>1.5.8</version>
</dependency>

昂首阔步
大摇大摆的jaxrs
1.5.8
昂首阔步
招摇过市的注解
1.5.8
应用程序类如下所示:

@ApplicationPath("/")
public class ServiceApplication extends Application {

final Set<Object> singletons = new HashSet<Object>();

public ServiceApplication() throws IOException {
    final InputStream inStream = getClass().getClassLoader()
            .getResourceAsStream("swagger.properties");
    final Properties props = new Properties();
    props.load(inStream);

    final BeanConfig beanConfig = new BeanConfig();
    beanConfig.setVersion("1.0.0");
    beanConfig.setHost(props.getProperty("host"));
    beanConfig.setBasePath("/rest-service");
    beanConfig.setResourcePackage("com.example.package");
    beanConfig.setScan(true);

    final CorsFilter filter = new CorsFilter();
    filter.getAllowedOrigins().add("*");
    singletons.add(filter);

}

@Override
public Set<Class<?>> getClasses() {
    final Set<Class<?>> resources = new HashSet<Class<?>>();
    // add WS classes
    resources.add(DatabasesImpl.class);

    // add provider classes
    resources.add(ExcMapper1.class);
    resources.add(ExcMapper2.class);
    resources.add(ResponseInterceptor.class);
    // add swagger classes
    resources.add(io.swagger.jaxrs.listing.ApiListingResource.class);
    resources.add(io.swagger.jaxrs.listing.SwaggerSerializers.class);
    return resources;
}

@Override
public Set<Object> getSingletons() {
    return singletons;
}
}
@ApplicationPath(“/”)
公共类ServiceApplication扩展了应用程序{
final Set singleton=new HashSet();
公共服务应用程序()引发IOException{
最终InputStream inStream=getClass().getClassLoader()
.getResourceAsStream(“swagger.properties”);
最终属性道具=新属性();
支柱荷载(河道内);
最终BeanConfig BeanConfig=新BeanConfig();
beanConfig.setVersion(“1.0.0”);
beanConfig.setHost(props.getProperty(“主机”);
beanConfig.setBasePath(“/rest服务”);
beanConfig.setResourcePackage(“com.example.package”);
beanConfig.设置扫描(真);
最终过滤器=新过滤器();
filter.getAllowedOriginates().add(“*”);
添加(过滤器);
}
@凌驾

public Set>resources=new hashset您在哪里添加
数据库
标记?@CássioMazzochiMolin我在使用webservice接口定义上的
@Api(value=“/databases”)
注释,但根据文档,
@Api(标签=……/代码>也应该可以。请考虑发布这部分代码。这与您的问题有关。@ C.Asi-SimoZoZoMuloin我将这个部分添加到问题中。虽然我怀疑这种行为可能与To软管注释有关。对我来说,这看起来更像是WebService加载或大举加载的问题,因为AFTE。r一个简单的重新加载(没有其他更改)它运行正常。您在第一次加载时是否得到任何堆栈跟踪?如果是,您可以提供吗?您在哪里添加
数据库
标记?@CássioMazzochiMolin我正在使用
@Api(value=“/databases”)
webservice接口定义上的注释,但根据文档,
@Api(标签=……/代码>也应该可以。请考虑发布这部分代码。这与您的问题有关。@ C.Asi-SimoZoZoMuloin我将这个部分添加到问题中。虽然我怀疑这种行为可能与To软管注释有关。对我来说,这看起来更像是WebService加载或大举加载的问题,因为AFTE。r一个简单的重新加载(没有其他更改)它运行良好。您在第一次加载时是否得到任何堆栈跟踪?如果是,您能提供吗?
@SwaggerDefinition(info = @io.swagger.annotations.Info(description = "<DESCRIPTION>",//
version = "0.0.2-SNAPSHOT", title = "Search", termsOfService = "<TOS>",//
contact = @io.swagger.annotations.Contact(name = "<CONTACT_NAME>", email = "<CONTACT_EMAIL>", url = "<CONTACT_URL>"),//
license = @io.swagger.annotations.License(name = "<LICENCE_NAME>", url = "<LICENCE_URL>")), consumes = {}, produces = { MediaType.APPLICATION_XML },//
schemes = { SwaggerDefinition.Scheme.HTTP, SwaggerDefinition.Scheme.HTTPS },//
externalDocs = @io.swagger.annotations.ExternalDocs(value = "<EXTERNAL_DOCS>", url = "<EXTERNAL_DOCS_URL>"))
@Api(value = "/databases")
@Path("/databases/")
public interface Databases {

@ApiOperation(value = "Searches the database")
@ApiResponses(value = { @ApiResponse(code = 200, message = "Success"),
        @ApiResponse(code = 404, message = "Database not found") })
@GET
@Path("{database}/search")
@Produces(MediaType.APPLICATION_XML)
public Response searchExport(
        @ApiParam(value = "the database name", required = true,  defaultValue = "default") @PathParam("database") @Nonnull final String database,
        @ApiParam(value = "query string defaults to match all", defaultValue = "title:foo") @QueryParam("q") @DefaultValue("*:*") final String query,
        @ApiParam(value = "starting element index defaults to 0") @QueryParam("start") @DefaultValue("0") final int start,
        @ApiParam(value = "number of elements to return defaults to 10") @QueryParam("rows") @DefaultValue("10") final int rows,
        @ApiParam(value = "sorting field") @QueryParam("sort") @DefaultValue("title") final String sort,
        @ApiParam(value = "sorting order defaults to ascending") @QueryParam("sortOrder") @DefaultValue("ascending") final SortDirection sortOrder)
                throws ParseException;