java - Jersey servlet 类是根据每个请求构建的

标签 java tomcat servlets glassfish servlet-container

我正在研究一个非常简单的 tomcat 和 jersey servlet 设置。我刚刚注意到为每个请求构造的 servlet 类。我读到的关于 servlet 的内容是它们是 init() 一次,service() 多次和 destroy() 一次。为什么我的设置不是这种情况。

下面是我的web.xml

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>

    <servlet>
        <servlet-name>contact-dropbox-servlet</servlet-name>
        <servlet-class>
            org.glassfish.jersey.servlet.ServletContainer
        </servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.inbhiwadi.services</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>contact-dropbox-servlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

我的 servlet 入口类如下所示:

@Path("/contact")
@Slf4j
public class ContactDropboxService {

    private ContactDAO contactDAO;

    private NotificationPublisher notificationPublisher;

    public ContactDropboxService() {
        ApplicationContext context = new ClassPathXmlApplicationContext("Spring-Module.xml");
        this.contactDAO = (ContactDAO) context.getBean("contactDAO");
        this.notificationPublisher = (NotificationPublisher) context.getBean("notificationPublisher");
        log.debug("ContactDropboxService constructed one more time");
    }

    @GET
    public String greet() {
        log.info("Welcome to InBhiwadi contact services!");
        return "Welcome to InBhiwadi contact services";
    }

    @POST
    @Path("/drop")
    public Response create(Contact contact) {

        log.debug("Received contact is : [{}]", contact.toString());
        contactDAO.create(contact);
        notificationPublisher.publish(contact.toString());
        return Response.accepted("Contact dropped in box").build();
    }
}

我应该怎么做才能让 ContactDropboxService 的单个实例服务于多个请求?

最佳答案

默认情况下,Jersey 会根据请求实例化资源类。如果你只想拥有一个资源类的实例,你应该用@Singleton 注释它。有关更多详细信息,您可以查看此 SO question

关于java - Jersey servlet 类是根据每个请求构建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47603878/

相关文章:

java - Android Volley 循环响应

java - SQL仅在所有行都满足条件时才选择行

tomcat - 在 DIY OpenShift 应用程序上设置 Tomcat 以与 Java8 一起使用

java - 如何为 request.getRequestDispatcher() 指定 .JSP 文件的路径?

用于 SQL Server 数据库的 Java Servlet 和 JDBC

java - java中的类端方法是什么意思?

java - 使用 Eclipse 将小程序添加到网站

spring - Servlet 中的请求和 session

windows - 杀死在任何端口上运行的 tomcat 服务,Windows

java - JSP获取上传文件的名称