如何直接访问Dropwizard资源,而不是通过REST访问

时间:2013-08-28 17:47:40

标签: java rest dao dropwizard

我创建了Dropwizard Resource并将其映射到REST API。 现在我想从我的代码中的其他点重用此Resource 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();
    }
}

请注意,使用dao:

初始化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();

你说什么?

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

我可以看到几种方法:

  1. 您手动创建ProviderDao并使用您创建的dao构建ProviderResource(dao)
  2. 您创建一个HttpClient对象,以便在资源运行时对其进行HTTP调用。为此,您可以使用Dropwizard's client libraries
  3. 您可以创建模拟调用和响应(这只会验证资源而不是DAO)。
  4. 您可以专门测试DAO。
  5. 从JDBI文档中,您可以像这样进行测试:

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