首页 > 解决方案 > JerseyServletModule 和 ServletModule 有什么区别?

问题描述

JerseyServletModule我想了解现在在jersey-guice图书馆和ServletModule在图书馆里有什么区别Guice

标签: jerseyguiceguice-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 服务的文档在这里

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 配合使用。


推荐阅读