当我有一个非常基本的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
,而无需单独注册类或必须添加应用程序包?
答案 0 :(得分:4)
这里的交易:导致类路径扫描的原因是一个{em} 注册任何内容的Application
类。因此,在ResourceConfig
(扩展Application
)中,如果您没有注册RolesAllowedDynamicFeature
,那么您将获得类路径扫描。我的猜测是你切换到ResourceConfig
,这样你可以注册RolesAllowedDyanamicFeature
(可能来自你看到的一些例子)。这也可以通过覆盖Application
在getClasses()
类中完成。但就像我说的那样,一旦你注册了任何东西,就会失去类路径扫描,你需要手动注册所有内容。
一种解决方法是实现Feature
来注册所有类,否则将被类路径扫描拾取。
@Provider
public class ClassPathScanWorkAroundFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
context.register(RolesAllowedDynamicFeauture.class);
return true;
}
}
这适用于Application
或ResourceConfig
类。在类路径扫描期间发生的事情是,Jersey将查找要注册的@Path
和 @Provider
注释类。因此,可以找到手动注册事物并仍然维护类路径扫描的解决方法。
我要指出的一件事是泽西岛开发商之一的以下文章。
基本上他们建议永远不要使用它。就个人而言,我只会坚持包扫描。我不认为它真的让生活变得更加困难。与使用Feature
的替代方法相比,它实际上是 less 代码。