我创建了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:
初始化ProviderResourcepublic 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();
你说什么?
答案 0 :(得分:4)
我认为我的问题基本上是错误的设计(这就是为什么从其他资源中使用资源并不容易)。
Resources层用于将REST API URL映射到方法中。 这些方法包含我们想要实现的操作的逻辑。 一个好的设计是在分离的服务中编写这些逻辑(Java类不是“DropWizard服务”)。
这些Services类最好在run()
方法中初始化一次,并作为构造函数依赖项传递给相关的Resources。
通过这种方式,我们可以创建具有逻辑的服务,以便在不同的资源中重用,每个资源都将保留其依赖关系(与我的问题代码示例中的dao相同)
答案 1 :(得分:1)
我可以看到几种方法:
ProviderDao
并使用您创建的dao构建ProviderResource(dao)
。HttpClient
对象,以便在资源运行时对其进行HTTP调用。为此,您可以使用Dropwizard's client libraries 从JDBI文档中,您可以像这样进行测试:
DBI dbi = new DBI("jdbc:h2:mem:test");
YourDAO dao = dbi.open(YourDAO.class);
// Test something
dao.close();