2013-08-28 4 views
2

Я создал ресурс Dropwizard и сопоставил его с API REST. Теперь я хочу повторно использовать этот 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

Я думаю, что мой вопрос в основном неправильно дизайн (и это почему это не тривиальное использовать ресурс из другого ресурса) ,

Уровень ресурсов предназначен для сопоставления URL-адресов REST API в методах. Эти методы содержат логику действий, которые мы хотим реализовать. Хорошим дизайном будет писать эту логику в разделенных службах (классы 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

Смежные вопросы