java-泽西ResourceConfig不会自动发现,但是应用程序会发现吗?

当我有一个非常基本的应用程序时,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

基本上,他们建议不要使用它.就我个人而言,我只会坚持进行包裹扫描.我认为这真的不会使生活变得如此艰难.实际上,与使用功能相比,它的代码更少.

上一篇:Java-JAXRS JerseyTest测试REST服务


下一篇:java-如何对@PathParam使用自定义类型?