Dropwizard 良好实践

Dropwizard good practices

我在很多地方看到,dropwizard 项目中的资源 class 有 GET 和 POST 的方法。这些方法然后使用 DAO 和 return 返回 json

从数据库访问数据
public class DropwizardResource {

    private DropwizardDAO ddao;

    public DropwizardResource (DropwizardDAO ddao) {
        this.ddao = ddao;
    }

    @GET
    @Timed
    @UnitOfWork
    public List<String> getAllResources() {
        return ddao.findAll();
    }
}

是否建议使用其他客户端为某些其他服务初始化资源,然后通过手动转换 json return?

public class DropwizardResource {

    private NonDbClient client;

    public DropwizardResource (NonDbClient client) {
        this.client = client;
    }

    @GET
    @Timed
    @UnitOfWork
    public List<String> getAllResources() {
        return toJson(client.findAll());
    }
}

首先,让我们明确一点:您可以在 Dropwizard 资源中做任何您想做的事——它们本身并没有什么特别之处。

关于您是否可以将“[客户端]用于某些其他服务”(例如,另一个 Dropwizard 服务,或完全独立的服务)的具体问题,答案是肯定的,这完全没问题。但是请注意,如果您不使用 Hibernate 在资源方法中访问数据库,则不需要 @UnitOfWork 注释(调用该方法时为 for declaring that a session & transaction should be managed for you)。

最后,你问是否可以"then have the json returned by manual conversion"。在不知道您正在考虑使用什么客户端以及调用它的 findAll 方法时它 return 是什么的情况下,很难回答这个问题。我可以想到几个可能的场景:

  1. 您从客户端返回反序列化的普通旧 Java 对象(无论它们在传输过程中如何序列化 - JSON、XML、疯狂的专有二进制协议,等等)。在这种情况下,您只需要将它们从您的 Dropwizard 资源方法(在您的示例中是 List<String>)转换为您想要 return 的任何对象。从那里开始,Jersey 和 Jackson 将为您将其序列化为 JSON,并将其放入您资源的响应中。
  2. 你从你的客户那里得到一个包含 JSON 的字符串。在这种情况下,您需要手动将 JSON 反序列化为 Java 对象(在应用程序的 run 方法中使用 Jackson ObjectMapper - you can grab one from the Dropwizard Environment)。那时你可以像上面的例子那样转换 then 和 return 它们。

在任何一种情况下,我都想不出为什么要将 序列化为 JSON (如您的示例所示)。那会给你 String(不是 List<String>)。除非你正在做一些非常古怪的事情,否则你可能不希望从你的 Dropwizard 资源中 returning 一个 JSON 字符串 - 然后它将再次序列化为 JSON,并且将然后导致在另一端再次反序列化充满 JSON 的字符串!