【发布时间】:2018-08-06 17:22:57
【问题描述】:
我正在尝试了解jersey-guice 库中的JerseyServletModule 和Guice 库中的ServletModule 之间的区别。
【问题讨论】:
标签: jersey guice guice-servlet
我正在尝试了解jersey-guice 库中的JerseyServletModule 和Guice 库中的ServletModule 之间的区别。
【问题讨论】:
标签: jersey guice guice-servlet
TL;DR - JerseyServletModule 已死。它曾经(在 Jersey 1 天)允许您使用 Jersey 和 Guice 并让它们玩得很好。这不再简单。
ServletModule 是一个 Guice 模块,它允许您使用 Guice 配置 servlet、servlet 映射、过滤器和过滤器映射(以及其他内容)以及将对象注入您的 servlet。创建一个继承自 ServletModule 的类并重写 configureServlets 方法,如下所示:
class MyModule extends ServletModule {
@Override
protected void configureServlets() {
serve("/hello").with(HelloAppEngine.class);
}
}
使用 Guice 和 ServletModule 构建 Web 服务的文档是 here。
Jersey 是 JSR 370 的实现,即所谓的 JAX-RS API,用于创建休息服务。它允许您仅使用带注释的类来构建休息服务 - 例如:
@Path("/user")
public class UserController {
UserPersistService userPersistService;
ObjectMapper objectMapper;
UserController(UserPersistService userPersistService, ObjectMapper objectMapper) {
this.userPersistService = userPersistService;
this.objectMapper = objectMapper;
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getUsersAsJSON() throws IOException {
final List<User> users = userPersistService.getUsers();
return objectMapper.writeValueAsString(users);
}
}
在 Jersey 1.0 的旧时代,覆盖 JerseyServletModule 而不是 Servlet Module 将允许您同时执行这两项操作,因此上述类可能变为:
@Singleton
@Path("/user")
public class UserController {
@Inject
UserPersistService userPersistService;
@Inject
ObjectMapper objectMapper;
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getUsersAsJSON() throws IOException {
final List<User> users = userPersistService.getUsers();
return objectMapper.writeValueAsString(users);
}
然而,正如我在开头提到的那样,在 Jersey 2.0 中没有与 JerseyServletModule 等效的东西。您的选择是配置 HK-Guice 桥接器并继续使用 Jersey,或者使用 RestEasy,它是一种替代 JAX-RS 实现,可以很好地与 guice 配合使用。
【讨论】: