如何在应用程序外部使用Jersey扫描资源的类路径?

时间:2017-06-06 05:11:57

标签: java jersey jax-rs

对于(服务器端)Application配置,我们可以使用

轻松扫描JAX-RS资源类的包
 ResourceConfig rCfg = new ResourceConfig();
 rCfg.packages("com.my.package", ...);    

然后使用ResourceConfig作为Application对象初始化应用程序。

虽然使用客户端,但目前尚不清楚如何执行包扫描。

我们可以做到

  Resource.from(SomeResourceClass.class);
如果我们知道类名,那么

获取资源。在我的情况下,我们不知道班级名称,我们希望根据他们的@Path获得班级。如果我们事先知道所有类名,我们可以使用重复调用Resource.from()来获取所有资源,然后按路径索引它们,然后根据需要查找路径。

但我们事先并不了解所有的班级名称。有没有办法让特定包中的所有Resource,甚至更好地扫描整个类路径 - 所有这些都没有初始化(服务器端)Application

1 个答案:

答案 0 :(得分:1)

对于包扫描,您可以使用PackageNamesScanner。这是一个例子

public static void main(String... args) throws Exception {
    final String[] pkgs = {"com.example.jersey"};
    final boolean recursive = true;

    final AnnotationAcceptingListener asl = new AnnotationAcceptingListener(Path.class);
    final PackageNamesScanner scanner = new PackageNamesScanner(pkgs, recursive);
    while (scanner.hasNext()) {
        final String next = scanner.next();
        if (asl.accept(next)) {
            try (final InputStream in = scanner.open()) {
                asl.process(next, in);
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        }
    }
    asl.getAnnotatedClasses().forEach(System.out::println);
}

不幸的是,我不认为有一个" ClassPathScanner"。类路径扫描仅用于servlet环境(并且Jersey可以在servlet环境之外运行),因此WebAppResourcesScanner中的类路径扫描有一次性实现,但在你的情况下它不适用,如它扫描特定的路径。

您还可以查看有关扫描带注释类的类路径的一些常规帖子,例如: