当我有一个非常基本的应用程序时,Jersey会自动发现项目中的所有REST资源,而无需手动注册它们:
import javax.ws.rs.ApplicationPath;
@ApplicationPath("/rest")
public class Application extends javax.ws.rs.core.Application {
}
但是,当我切换到使用特定于Jersey的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自动发现像Application之类的REST资源,而不必分别注册类或添加应用程序的包?
解决方法:
达成协议:导致类路径扫描的原因是没有注册任何内容的Application类.因此,在您的ResourceConfig(扩展了Application)中,如果未注册RolesAllowedDynamicFeature,则将获得类路径扫描.我的猜测是,您已切换到ResourceConfig,以便可以注册RolesAllowedDyanamicFeature(也许来自您看到的某些示例).也可以通过重写getClasses()在Application类中完成此操作.但是就像我说的那样,一旦注册任何内容,就会丢失类路径扫描,并且需要手动注册所有内容.
解决方法之一是实现一种功能,以注册您的所有类,否则类路径扫描将不会拾取所有类.
@Provider
public class ClassPathScanWorkAroundFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
context.register(RolesAllowedDynamicFeauture.class);
return true;
}
}
这对于Application或ResourceConfig类均适用.在类路径扫描期间发生的事情是,Jersey将同时查找@Path和@Provider注释的类进行注册.因此,找到了一种解决方法,可以手动注册事物并仍然维护类路径扫描.
我要指出的一件事是泽西岛的一位开发人员撰写的以下文章.
> When to Use JAX-RS Class-path Scanning Mechanism
基本上,他们建议不要使用它.就我个人而言,我只会坚持进行包裹扫描.我认为这真的不会使生活变得如此艰难.实际上,与使用功能相比,它的代码更少.