2017-08-15 47 views
0

当我有一个非常基本的Application,泽西自动发现在该项目中的所有REST资源,我不必手动注册它们:泽西岛的ResourceConfig不会自动发现,但应用程序呢?

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自动发现的REST资源,如Application,而无需单独注册类或无需添加应用程序的包?

回答

0

这里的处理:什么导致类路径扫描,是Application不是注册任何东西。因此,在您的ResourceConfig(其中扩展Application),如果您没有注册RolesAllowedDynamicFeature,您将得到类路径扫描。我的猜测是你切换到ResourceConfig,以便你可以注册RolesAllowedDyanamicFeature(也许从你看到的一些例子)。这也可以通过重写getClasses()Application类中完成。但正如我所说,一旦你注册什么你失去了类路径扫描,你需要手动注册一切。

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

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

这将工作同时为ApplicationResourceConfig类。在类路径扫描期间发生的事情是,Jersey将寻找注册类别的@Path@Provider注释类别。所以这是找到一种解决方法来手动注册事件,并仍然维护类路径扫描。

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

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