Dropwizard良好做法

时间:2015-09-24 19:29:34

标签: json database resources dropwizard

我在很多地方都看到dropwizard项目中的资源类有GET和POST方法。然后,这些方法使用DAO从数据库访问数据并返回一个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?

public class DropwizardResource {

    private NonDbClient client;

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

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

1 个答案:

答案 0 :(得分:1)

首先,让我们明确一点:你可以在Dropwizard资源中做任何你喜欢的事情 - 关于它们没有什么特别的。

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

最后,你问“是否可以通过手动转换返回json”。在不知道您正在考虑使用哪个客户端以及在调用其findAll方法时返回的内容时,回答这个问题有点困难。我可以想到几种可能的情况:

  1. 您从客户端返回反序列化的普通旧Java对象(无论它们是如何在传输中序列化的 - JSON,XML,疯狂的专有二进制协议,等等)。在这种情况下,您只需将这些转换为您想要从Dropwizard资源方法返回的任何对象(在您的示例中为List<String>)。从那里开始,泽西岛和杰克逊将为您处理将此序列化为JSON并将其放入您的资源的响应中。
  2. 您从客户端获得一个包含JSON的字符串。在这种情况下,您需要手动将JSON反序列化为Java对象(在应用程序的ObjectMapper方法中使用Jackson run - you can grab one from the Dropwizard Environment)。此时,您可以转换然后返回它们,如上例所示。
  3. 在任何一种情况下,我都无法想到你为什么要将序列化为 JSON(如你的例子中所示)。这会给你一个String(不是List<String>)。除非你正在做一些非常古怪的事情,否则你可能不希望从你的Dropwizard资源返回一个JSON字符串 - 然后再将它作为JSON序列化,然后将导致一个充满JSON的字符串再次被反序列化。另一端!