【问题标题】:How can I access Dropwizard Resource directly, and not via REST如何直接访问 Dropwizard 资源,而不是通过 REST
【发布时间】:2013-08-28 17:47:40
【问题描述】:

我创建了 Dropwizard 资源并将其映射到 REST API。 现在我想从我的代码中的其他点重用这个资源 API 作为 JAVA API。 我该怎么做?

这是资源类:

@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 是用 dao 初始化的:

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();

你说什么?

【问题讨论】:

    标签: java rest dao dropwizard


    【解决方案1】:

    我认为我的问题基本上是错误的设计(这就是为什么从其他资源中使用资源并非易事)。

    资源层用于将 REST API URL 映射到方法中。 这些方法包含我们想要实现的操作的逻辑。 一个好的设计是在独立的服务中编写这些逻辑(Java 类而不是“DropWizard 服务”)。

    这些服务类最好在run()方法中初始化一次,并作为构造函数依赖传递给相关的资源。 通过这种方式,我们可以创建具有逻辑的服务,以便在不同的资源中重用,并且每个资源都将保存其依赖项(就像我的问题代码示例中的 dao)

    【讨论】:

      【解决方案2】:

      我可以看到几种方法:

      1. 您手动创建一个ProviderDao 并使用您创建的dao 构造您的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();
      

      【讨论】:

      • 您的回答非常好。环顾四周并询问朋友后,我发现了如何解决我的问题。您可以在我的自我回答中看到它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2015-09-22
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多