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() 来测试是否需要任何过滤。