JerseyServletModule
我想了解现在在jersey-guice
图书馆和ServletModule
在图书馆里有什么区别Guice
。
1 回答
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 服务的文档在这里。
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 配合使用。