2013-08-28 61 views
2

我已經創建了Dropwizard資源並將其映射到REST API。 現在我想從我的代碼中的其他點重新使用這個資源API作爲JAVA API。 我該怎麼辦?如何直接訪問Dropwizard資源,而不是通過REST登錄

這是資源類:

@Path("/providers_new") 
public class ProviderResource { 
    private ProviderDAO dao; 

    public ProviderResource(ProviderDAO dao) { 
     this.dao = dao; 
    } 

    @GET 
    @Path("/get") 
    @Produces("application/json") 
    public List<Provider> getAll() { 
     return dao.getAllProviders(); 
    } 
} 

請注意,ProviderResource與道初始化:

public class EntitiesService extends Service<EntitiesServiceConfiguration> { 
    public static void main(String[] args) throws Exception { 
     new EntitiesService().run(args); 
    } 

    @Override 
    public void initialize(Bootstrap<EntitiesServiceConfiguration> bootstrap) { 
     bootstrap.setName("entities"); 
     ... 
    } 

    @Override 
    public void run(EntitiesServiceConfiguration configuration, 
       Environment environment) throws ClassNotFoundException { 
     final DBIFactory factory = new DBIFactory(); 
     final DBI jdbi = factory.build(environment, configuration.getDatabaseConfiguration(), "my_db"); 
     final ProviderDAO dao = jdbi.onDemand(ProviderDAO.class); 
     environment.addResource(new ProviderResource(dao)); 
     ... 
    } 
} 

現在ProviderResource是在空中,我想從我的代碼中使用它。例如:

ArrayList<Provider> providers = iDontKnowHowToGetProviderResource.getAll(); 

你說什麼?

回答

4

我認爲我的問題基本上是沒錯的設計(這就是爲什麼它不平凡的使用資源進行其他資源) 。

資源層用於將REST API URL映射到方法中。 這些方法擁有我們想要實現的動作的邏輯。 一個好的設計是將這些邏輯寫入單獨的服務中(Java類不是「DropWizard服務」)。

這些服務類最好在run()方法中初始化一次,並作爲構造函數依賴項傳遞給相關資源。 通過這種方式,我們可以創建具有不同資源的邏輯的服務,並且每個資源都會保留其依賴關係(與我的問題代碼示例中的dao相同)

1

我可以看到一對夫婦的方法:

  1. 您手動創建一個ProviderDao和構建你的ProviderResource(dao)與您共創道。
  2. 您創建一個HttpClient對象,以在您的資源運行時對其進行HTTP調用。爲此,您可以使用Dropwizard's client libraries
  3. 您可以創建模擬調用和響應(這隻會驗證資源而不是DAO)。
  4. 您可以專門測試DAO。

從JDBI文檔,你可以測試這樣的:

DBI dbi = new DBI("jdbc:h2:mem:test"); 
YourDAO dao = dbi.open(YourDAO.class); 

// Test something 
dao.close(); 
+0

您的回答非常好。環顧四周,詢問朋友後,我發現如何解決我的問題。你可以在我自己的回答中看到它。 – LiorK

相關問題