java - 如何列出 Jersey 所有已注册的 JAX-RS 实体提供者

标签 java jersey jax-rs jersey-2.0

假设我有一个带有嵌入式 jetty 的简单 Jersey 应用 Demo project on github和下面的基本代码。

在使用 jersey1 的时候,我有日志消息:

мая 07, 2016 5:05:50 AM com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
  ru.varren
мая 07, 2016 5:05:50 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
  class ru.varren.MyResource
мая 07, 2016 5:05:50 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Provider classes found:
  class ru.varren.JsonProvider
мая 07, 2016 5:05:50 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.19.1 03/11/2016 02:08 PM'

但现在我正在尝试使用 jersey2,但没有更多日志信息。所以,我的问题是如何列出所有已注册的 JAX-RS 实体提供者。我不太在乎在哪里列出它们。在 main 函数或某些 @GET MyResource 方法中。可能我应该在我的设置中更改某些内容或将记录器 boolean 值,但找不到它。

这纯粹是为了测试目的。所有提供者类的简单打印对我来说就足够了。更酷的选择是打印提供者和相关的 @Produces@Consumes MediaType。

MyResource.java

@Path("test")
public class MyResource {

    @GET
    @Produces({ MediaType.APPLICATION_JSON })
    public Response  getPersons() {
        return Response.ok("[some data here]").build();
    }

}

MyApplication.java

public class MyApplication {

    public static void main(String[] args) throws Exception {
        URI baseUri = UriBuilder.fromUri("http://localhost/").port(9998).build();
        ResourceConfig config = new ResourceConfig(MyResource.class);
        config.packages("ru.varren");
        Server server = JettyHttpContainerFactory.createServer(baseUri, config, true);
        server.join();
    }

}

gradle.build

dependencies {  
    compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.22.2'
    compile 'org.glassfish.jersey.containers:jersey-container-servlet-core:2.22.2'
    compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.22.2'
    compile 'org.glassfish.jersey.containers:jersey-container-jetty-http:2.22.2'

    compile 'org.eclipse.jetty:jetty-server:9.1.0.M0'
    compile 'org.eclipse.jetty:jetty-servlet:9.1.0.M0'
}

最佳答案

您可以使用 ApplicationEventListener ,并且在 INITIALIZATION_FINISHED 上,您可以从 ApplicationEvent 中获取一组资源和提供程序。 .例如

@Provider
public class ProviderLoggingListener implements ApplicationEventListener {
 
    @Override
    public void onEvent(ApplicationEvent event) {
        switch (event.getType()) {
            case INITIALIZATION_FINISHED: {
                Set<Class<?>> providers = event.getProviders();
                ResourceConfig immutableConfig = event.getResourceConfig();
                ResourceModel resourcesModel = event.getResourceModel();
                break;
            }
        }
    }
 
    @Override
    public RequestEventListener onRequest(RequestEvent requestEvent) {
        return null;
    }
}

另请参阅:

关于java - 如何列出 Jersey 所有已注册的 JAX-RS 实体提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37084029/

相关文章:

java - 动态设置图像到 ImageView

java - Apache Commons Lang 类 "add"的时间复杂度为 'ArrayUtils'

java - 使用java读取apache beam中的多个csv文件

java - Jersey/Jaxb 为 beans 列表别名

java - 如何设置 Jersey JAX-RS 服务器端记录器级别?

java - REST 的媒体类型

java - 如何使用 json 将数组数据传递到 Apache Wink Controller

java - 在 Java 中重用具有常量后缀的字符串的最佳实践

java - Jersey 2.x 带有属性的自定义注入(inject)注释

java - 使用 Swagger 记录现有的 JAX-RS 实现而不对其进行注释