【问题标题】:using ServletContainer when writing REST Web Service using Jersey使用 Jersey 编写 REST Web 服务时使用 ServletContainer
【发布时间】:2018-01-17 14:45:26
【问题描述】:

使用 Jersey 编写 Web 服务时,我将 ServletContainer 添加到 web.xml

 <servlet>
    <servlet-name>Back-End API</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>

这个 ServletContainer 有什么用? tomcat 不是 ServletContainer 吗?
有没有办法在没有 Jersey 或任何其他第三方框架的情况下实现 Rest Web 服务?

【问题讨论】:

    标签: java rest web-services servlets jersey


    【解决方案1】:

    这个ServletContainer有什么用?

    通常在其 javadoc 中解释了任何类的使用。幸运的是,泽西人认真对待 javadocs,而您的答案确实是 right there

    com.sun.jersey.spi.container.servlet

    类 ServletContainer

    ServletFilter 用于部署根资源类。

    如果这个类被声明为一个过滤器并且没有设置初始化参数PROPERTY_WEB_PAGE_CONTENT_REGEX或者FEATURE_FILTER_FORWARD_ON_404没有设置为true,那么这个过滤器必须声明在过滤器链的最后一个位置,因为过滤器不会转发对链中下一个过滤器(如果有)的任何请求。

    以下部分引用了初始化参数。除非另有说明,否则初始化参数适用于服务器和过滤器初始化参数。

    servlet 或过滤器可以配置为具有初始化参数“com.sun.jersey.config.property.resourceConfigClass”或“javax.ws.rs.Application”,其值是一个类的完全限定名实现ResourceConfigApplication。如果具体类有一个构造函数,该构造函数采用 Map 类型的单个参数,则使用该构造函数实例化该类,并将包含所有初始化参数的 Map 实例作为参数传递。否则,该类被实例化为由运行时管理的单例组件,并且可以执行注入(可以注入的工件仅限于在配置 servlet 或过滤器时注册的可注入提供程序)。

    如果初始化参数“com.sun.jersey.config.property.resourceConfigClass”或“javax.ws.rs.Application”不存在并且初始化参数“com.sun.jersey.config.property.packages”存在(请参阅PackagesResourceConfig.PROPERTY_PACKAGES)创建PackagesResourceConfig 的新实例。初始化参数“com.sun.jersey.config.property.packages”必须设置为提供一个或多个包名称。每个包名必须用';'分隔。使用属性名称“com.sun.jersey.config.property.packages”将包名称作为属性值添加到 Map 实例。然后将任何其他初始化参数添加到 Map 实例。然后将该 Map 实例传递给 PackagesResourceConfig 的构造函数。

    如果上述资源配置相关的初始化参数均不存在,则创建WebAppResourceConfig 的新实例。初始化参数“com.sun.jersey.config.property.classpath”可以设置为提供一个或多个资源路径。每条路径必须用';'分隔。使用属性名称“com.sun.jersey.config.property.classpath”将资源路径作为属性值添加到 Map 实例。然后将任何其他初始化参数添加到 Map 实例。然后将该 Map 实例传递给WebAppResourceConfig 的构造函数。如果初始化参数不存在,则使用以下资源路径:“/WEB-INF/lib”和“/WEB-INF/classes”。

    所有初始化参数都作为创建的ResourceConfig的属性添加。

    将创建和配置一个新的WebApplication 实例,以便可以使用上下文将以下类注入到根资源、提供程序和应用程序类中:HttpServletRequestHttpServletResponseServletContextServletConfigWebConfig。如果此类用作Servlet,则可以注入ServletConfig 类。如果此类用作Filter,则可以注入FilterConfig 类。 WebConfig 可以注入到抽象 servlet 或过滤器部署中。

    可以通过扩展此类并覆盖方法initiate(ResourceConfig, WebApplication) 以使用IoCComponentProviderFactory 实例启动WebApplication 来注册IoCComponentProviderFactory 实例。


    tomcat 不是 ServletContainer 吗?

    是的,是的。只是com.sun.jersey.spi.container.servlet.ServletContainer这个类的名字选错了。他们最好将其命名为 RestControllerRestApiDispatcher orso。


    有没有办法在没有 Jersey 或任何其他第三方框架的情况下实现 Rest web 服务?

    是的。您有多种选择:

    • Homegrow your own framework。在业余爱好项目中作为学习练习很有趣,但是在生产应用程序中这样做时,它只会长期咬你。很难。
    • 或者,更好的是replace Tomcat by a real Java EE server。它具有内置的 JAX-RS 等功能,您可以轻松进行手动配置。根据 Java EE 服务器,JAX-RS 实现可能依次由 Jersey (GlassFish/Payara) 或 RESTEasy (WildFly/JBossAS) 或 CXF (TomEE) 或其他方式表示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-10
      • 2011-01-01
      • 2012-04-13
      • 2023-04-06
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      相关资源
      最近更新 更多