Dropwizard 资源和可选列表参数
Dropwizard resources and optional list arguments
我正在开发一个用作电话簿的测试 DropWizard Web 服务(基于 this Packt Publishing book。
我有一个 ContactResource class,其中包含用于索引联系人的标准路径:
@Path("/contacts")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class ContactResource {
private final ContactDao contactDao;
public ContactResource(DBI jdbi) {
contactDao = jdbi.onDemand(ContactDao.class);
}
@GET
public Response indexContacts(@QueryParam("ids") Optional<List<Integer>> ids) {
List<Contact> contacts;
contacts = contactDao.indexContacts(ids);
return Response.status(Response.Status.OK).entity(contacts).build();
}
}
如上面的代码所示,我希望索引操作 可选 按 id 过滤结果(发送 id 列表时)。我想在不发送 ids
参数时获取所有联系人。
很遗憾,服务拒绝启动并出现以下错误:
[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response com.dwbook.phonebook.resources.ContactResource.indexContacts(com.google.common.base.Optional) at index 0.
如果我删除 Optional<>
位并重构 contactDao 方法,则该路由有效。不过,重点是允许可选过滤。
如何在 DropWizard 中定义 Optional<List<T>>
参数?
提前致谢!
编辑:根据 condit 的回答,我以这种方式重构了操作:
@GET
public Response indexContacts(@QueryParam("ids") List<Integer> ids) {
List<Contact> contacts;
if(ids.isEmpty()) {
contacts = contactDao.indexContacts();
} else {
contacts = contactDao.filterContactsByIds(ids);
}
return Response.status(Response.Status.OK).entity(contacts).build();
}
这行得通,但如果我必须实施多个过滤器(即,可选择按名字、姓氏或国籍过滤联系人),我会发现这很快就会失控。
一般来说,在 Dropwizard/JDBI 中实现任意数量的可选过滤器的首选方法是什么?
Jersey 不知道如何处理 Optional
参数。它只处理 default entity types 除非其他人已注册。
不过,在这种情况下,我认为您甚至不需要 Optional
,因为您可以通过 List
免费获得它。如果没有指定的 ids
查询参数,Jersey 将生成一个空的 List
,您可以使用 ids.isEmpty()
来测试是否需要任何过滤。
我正在开发一个用作电话簿的测试 DropWizard Web 服务(基于 this Packt Publishing book。
我有一个 ContactResource class,其中包含用于索引联系人的标准路径:
@Path("/contacts")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class ContactResource {
private final ContactDao contactDao;
public ContactResource(DBI jdbi) {
contactDao = jdbi.onDemand(ContactDao.class);
}
@GET
public Response indexContacts(@QueryParam("ids") Optional<List<Integer>> ids) {
List<Contact> contacts;
contacts = contactDao.indexContacts(ids);
return Response.status(Response.Status.OK).entity(contacts).build();
}
}
如上面的代码所示,我希望索引操作 可选 按 id 过滤结果(发送 id 列表时)。我想在不发送 ids
参数时获取所有联系人。
很遗憾,服务拒绝启动并出现以下错误:
[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response com.dwbook.phonebook.resources.ContactResource.indexContacts(com.google.common.base.Optional) at index 0.
如果我删除 Optional<>
位并重构 contactDao 方法,则该路由有效。不过,重点是允许可选过滤。
如何在 DropWizard 中定义 Optional<List<T>>
参数?
提前致谢!
编辑:根据 condit 的回答,我以这种方式重构了操作:
@GET
public Response indexContacts(@QueryParam("ids") List<Integer> ids) {
List<Contact> contacts;
if(ids.isEmpty()) {
contacts = contactDao.indexContacts();
} else {
contacts = contactDao.filterContactsByIds(ids);
}
return Response.status(Response.Status.OK).entity(contacts).build();
}
这行得通,但如果我必须实施多个过滤器(即,可选择按名字、姓氏或国籍过滤联系人),我会发现这很快就会失控。
一般来说,在 Dropwizard/JDBI 中实现任意数量的可选过滤器的首选方法是什么?
Jersey 不知道如何处理 Optional
参数。它只处理 default entity types 除非其他人已注册。
不过,在这种情况下,我认为您甚至不需要 Optional
,因为您可以通过 List
免费获得它。如果没有指定的 ids
查询参数,Jersey 将生成一个空的 List
,您可以使用 ids.isEmpty()
来测试是否需要任何过滤。