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 是什么的情况下,很难回答这个问题。我可以想到几个可能的场景:
- 您从客户端返回反序列化的普通旧 Java 对象(无论它们在传输过程中如何序列化 - JSON、XML、疯狂的专有二进制协议,等等)。在这种情况下,您只需要将它们从您的 Dropwizard 资源方法(在您的示例中是
List<String>
)转换为您想要 return 的任何对象。从那里开始,Jersey 和 Jackson 将为您将其序列化为 JSON,并将其放入您资源的响应中。
- 你从你的客户那里得到一个包含 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 的字符串!
我在很多地方看到,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 是什么的情况下,很难回答这个问题。我可以想到几个可能的场景:
- 您从客户端返回反序列化的普通旧 Java 对象(无论它们在传输过程中如何序列化 - JSON、XML、疯狂的专有二进制协议,等等)。在这种情况下,您只需要将它们从您的 Dropwizard 资源方法(在您的示例中是
List<String>
)转换为您想要 return 的任何对象。从那里开始,Jersey 和 Jackson 将为您将其序列化为 JSON,并将其放入您资源的响应中。 - 你从你的客户那里得到一个包含 JSON 的字符串。在这种情况下,您需要手动将 JSON 反序列化为 Java 对象(在应用程序的
run
方法中使用 JacksonObjectMapper
- you can grab one from the DropwizardEnvironment
)。那时你可以像上面的例子那样转换 then 和 return 它们。
在任何一种情况下,我都想不出为什么要将 序列化为 JSON (如您的示例所示)。那会给你 String
(不是 List<String>
)。除非你正在做一些非常古怪的事情,否则你可能不希望从你的 Dropwizard 资源中 returning 一个 JSON 字符串 - 然后它将再次序列化为 JSON,并且将然后导致在另一端再次反序列化充满 JSON 的字符串!