2017-06-06 56 views
1

在(服務器端)Application結構的情況下,我們可以很容易地掃描JAX-RS資源類的包與如何在應用程序之外掃描澤西島資源的類路徑?

ResourceConfig rCfg = new ResourceConfig(); 
rCfg.packages("com.my.package", ...);  

,然後初始化使用ResourceConfig作爲Application對象的應用程序。

雖然使用客戶端,但不清楚如何執行包掃描。

我們可以做

Resource.from(SomeResourceClass.class); 

獲得資源,如果我們知道的類名。在我的情況下,我們不知道類名,我們希望根據他們的@Path獲得類。如果我們事先知道所有類名,我們可以使用重複調用Resource.from()來獲取所有資源,然後通過路徑索引它們,然後根據需要查找路徑。

但是我們並不知道所有的類名都在前面。有什麼方法可以讓特定包中的所有Resource,或者甚至更好地掃描整個類路徑 - 全部不需要初始化(服務器端)Application

+0

或者,如果有一個特點,我們可以初始化作爲一個獨立的或剝離下來的應用程序(即沒有構成服務器的所有功能),並且只會根據給定的路徑執行資源分辨率,這也將起作用... – BadZen

回答

1

對於包裝掃描,您可以使用PackageNamesScanner。這裏是一個例子

public static void main(String... args) throws Exception { 
    final String[] pkgs = {"com.example.jersey"}; 
    final boolean recursive = true; 

    final AnnotationAcceptingListener asl = new AnnotationAcceptingListener(Path.class); 
    final PackageNamesScanner scanner = new PackageNamesScanner(pkgs, recursive); 
    while (scanner.hasNext()) { 
     final String next = scanner.next(); 
     if (asl.accept(next)) { 
      try (final InputStream in = scanner.open()) { 
       asl.process(next, in); 
      } catch (IOException ex) { 
       throw new RuntimeException(ex); 
      } 
     } 
    } 
    asl.getAnnotatedClasses().forEach(System.out::println); 
} 

不幸的是,我不認爲有一個「ClassPathScanner」。類路徑掃描僅用於servlet環境(並且Jersey可以在servlet環境之外運行),因此在WebAppResourcesScanner的類路徑掃描中有一次性實施,但在您的情況下它不起作用,因爲它掃描特定路徑。

您也可以看一些關於掃描類路徑註釋類,像一般的帖子:

+0

完美,我能夠對這些C使用'ResourceModel.Builder'來掃描資源模型的包。 – BadZen