Jersey ResourceConfig没有自动发现,但应用程序呢?

时间:2017-08-15 19:43:22

标签: java rest jersey jax-rs jersey-2.0

当我有一个非常基本的Application时,Jersey auto会发现项目中的所有REST资源,而我不必手动注册它们:

import javax.ws.rs.ApplicationPath;
@ApplicationPath("/rest")
public class Application extends javax.ws.rs.core.Application {

}

但是,当我切换到使用泽西特定的ResourceConfig时,自动发现似乎无法正常工作。我必须#registerClasses()或添加包,如下所示:

@ApplicationPath("rest")
public class ResourceConfig  extends org.glassfish.jersey.server.ResourceConfig {
    public ResourceConfig() {
        super();        
        register(RolesAllowedDynamicFeature.class);
        super.packages(true, "org.example");
    }
}

有没有办法让ResourceConfig自动发现REST资源,如Application,而无需单独注册类或必须添加应用程序包?

1 个答案:

答案 0 :(得分:4)

这里的交易:导致类路径扫描的原因是一个{em} 注册任何内容的Application类。因此,在ResourceConfig(扩展Application)中,如果您没有注册RolesAllowedDynamicFeature,那么您将获得类路径扫描。我的猜测是你切换到ResourceConfig,这样你可以注册RolesAllowedDyanamicFeature(可能来自你看到的一些例子)。这也可以通过覆盖ApplicationgetClasses()类中完成。但就像我说的那样,一旦你注册了任何东西,就会失去类路径扫描,你需要手动注册所有内容。

一种解决方法是实现Feature来注册所有类,否则将被类路径扫描拾取。

@Provider
public class ClassPathScanWorkAroundFeature implements Feature {
    @Override
    public boolean configure(FeatureContext context) {
        context.register(RolesAllowedDynamicFeauture.class);
        return true;
    }
}

这适用于ApplicationResourceConfig类。在类路径扫描期间发生的事情是,Jersey将查找要注册的@Path @Provider注释类。因此,可以找到手动注册事物并仍然维护类路径扫描的解决方法。

我要指出的一件事是泽西岛开发商之一的以下文章。

基本上他们建议永远不要使用它。就个人而言,我只会坚持扫描。我不认为它真的让生活变得更加困难。与使用Feature的替代方法相比,它实际上是 less 代码。