Jersey ResourceConfig 不会自动发现,但应用程序会吗?

Mic*_*jan 3 java rest jax-rs jersey jersey-2.0

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

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

}
Run Code Online (Sandbox Code Playgroud)

但是当我切换到使用 Jersey specific 时ResourceConfig,自动发现似乎不起作用。我必须#registerClasses()或者添加如下所示的包:

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

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

Pau*_*tha 5

这是交易:导致类路径扫描的原因是一个没有注册任何东西的Application类。所以在你的(它扩展)中,如果你没有注册,你会得到类路径扫描。我的猜测是您切换到以便您可以注册(可能来自您看到的某些示例)。这也可以通过覆盖. 但是就像我说的,一旦你注册了任何东西,你就会失去类路径扫描,你需要手动注册所有东西。ResourceConfigApplicationRolesAllowedDynamicFeatureResourceConfigRolesAllowedDyanamicFeatureApplicationgetClasses()

一种解决方法是实现一个Feature注册所有类,否则类路径扫描不会选择这些类。

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

这将适用于该类ApplicationResourceConfig该类。在类路径扫描期间会发生什么,Jersey 将同时查找@Path @Provider注解的类来注册。因此,这是找到一种手动注册内容并仍然保持类路径扫描的解决方法。

我要指出的一件事是 Jersey 的一位开发人员撰写的以下文章。

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