JBoss.orgCommunity Documentation

第 3 章 安装/配置

3.1. WildFly 中的 RESTEasy 模块
3.1.1. 其他 RESTEasy 模块
3.1.2. 升级 WildFly 中的 RESTEasy
3.2. 将 RESTEasy 应用程序部署到 WildFly
3.3. 部署到其他 servlet 容器
3.3.1. Servlet 3.0 容器
3.3.2. 老的 servlet 容器
3.4. 配置
3.4.1. RESTEasy with MicroProfile Config
3.4.2. 完全使用 MicroProfile Config
3.4.3. 使用 RESTEasy 的 MicroProfile Config扩展
3.4.4. 配置 MicroProfile Config
3.4.5. RESTEasy 的经典配置机制
3.4.6. 覆盖 RESTEasy 的配置机制
3.5. 配置开关
3.6. javax.ws.rs.core.Application
3.7. RESTEasy 作为 ServletContextListener
3.8. RESTEasy 作为 Servlet Filter
3.9. 客户端

RESTEasy 可以根据你的运行环境,采取不同的安装和配置方式。如果你正在使用 WildFly,RESTEasy 已经被完全集成和捆绑进去,所以你只需要做很少的事情。如果您在其他的环境中运行,则必须手动进行一些安装和配置。

在 WildFly 中,只有在部署 JAX-RS 应用程序时(由 JAX-RS 注解的存在决定) ,RESTEasy 和 JAX-RS API 才会自动加载到部署的类路径中。但是,只有一些 RESTEasy 特性是自动加载的。见表3.1。如果您需要那些未自动加载的库中的任何一个,那么您必须使用 WAR 文件的 WEB-INF 目录中的 jboss-deployment-structure.xml 文件引入它们。下面是一个例子:

<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.jboss.resteasy.resteasy-jackson-provider" services="import"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

对于在 META-INF/services/javax.ws.rs.ext.Providers 文件中具有默认提供程序的模块,必须将 services 属性设置为"import"。

要了解在部署 JAX-RS 服务时默认加载了哪些 RESTEasy 模块,请参阅下表,该表是指使用当前RESTEasy发行版修补的最新WildFly发行版。显然,未来的 WildFly 发行版和未修补的 WildFly 发行版在默认启用的模块方面可能有所不同,因为容器实际上也控制着它们。


并非所有 RESTEasy 模块都与 WildFly 绑定。例如, resteasy-fastinfoset-providerresteasy-wadl 没有包含在 第 3.1 节 “ WildFly 中的 RESTEasy 模块” 中列出的模块中。如果希望在应用程序中使用它们,可以将它们包含在 WAR 包中,就像在 WildFly 之外部署它们一样。有关更多信息,请参见 第 3.3 节 “部署到其他 servlet 容器”

RESTEasy 与 WildFly 捆绑在一起,但您可能希望将 WildFly 中的 RESTEasy 升级到最新版本。RESTEasy 发行版附带一个名为 resteasy-jboss-modules-4.7.0-SNAPSHOT.zip 的压缩文件。将此文件解压缩到 WildFly 发行版的 modules/system/layers/base/ 目录中。这将配置 WildFly 使用 第 3.1 节 “ WildFly 中的 RESTEasy 模块” 中列出的模块的新版本。

要构建 resteasy-jboss-modules-4.7.0-SNAPSHOT.zip ,请进入项目的 jboss-modules 目录,并运行以下 Maven 命令:

$ mvn install

它将开始构建模块,最后将在 "target" 目录中生成 zip 文件:

$ pwd
resteasy/jboss-modules
$ ls target/*.zip
target/resteasy-jboss-modules-4.7.0-SNAPSHOT-mavenized.zip
target/resteasy-jboss-modules-4.7.0-SNAPSHOT.zip

要使用这个 zip 文件,你需要将它复制到 Wildfly 的 "modules" 目录中:

$ pwd
wildfly
$ ls
LICENSE.txt       bin               domain            standalone
README.txt        copyright.txt     jboss-modules.jar welcome-content
appclient         docs              modules

使用以下步骤将模块的 zip 文件复制并解压缩到 Wildfly 的 modules 目录中:

$ cp ~/works/resteasy/jboss-modules/target/resteasy-jboss-modules-4.7.0-SNAPSHOT.zip \
modules/system/layers/base/
$ cd modules/system/layers/base
$ unzip resteasy-jboss-modules-4.7.0-SNAPSHOT.zip
...

通过上述过程,RESTEasy 模块在 Wildfly 中得到升级。

RESTEasy 与 WildFly 捆绑在一起,并根据 Java EE 的要求完全集成。您可以将其与 EJB 和 CDI 一起使用,并且可以完全依赖 WildFly 来扫描和部署 JAX-RS 服务和提供者。您需要提供的只是打包在 WAR 中的 JAX-RS 服务和提供者类,它们可以是 POJOs、 CDI beans 或 EJBs。配置应用程序的一种简单方法是提供一个空的 web.xml 文件。当然,你可以在 web.xml 中部署任何你想要的定制 servlet、过滤器或者安全约束,但是这些都不是必需的:

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
</web-app>

另外,如果您想调整或打开/关闭 RESTEasy 的任何特定功能,web.xml 可以提供 init-params 和 context-params 配置选项 (参见 第 3.5 节 “配置开关” )。

因为我们没有使用 <servlet-mapping> 元素,所以我们必须定义一个 javax.ws.rs.core.Application 类(见 第 3.6 节 “javax.ws.rs.core.Application” ) 并带有 javax.ws.rs.ApplicationPath 注解。如果扫描返回类或单例是空集(这是从 Application 继承而来的行为) ,那么将根据 JAX-RS 注解的存在情况,对 WAR 进行资源和提供程序类的扫描。

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/root-path")
public class MyApplication extends Application
{
}       

Note. 实际上,如果应用的 jar 包包含一个带有 ApplicationPath 注解的 Application 类(或其子类) ,则根本不需要 web.xml 文件。当然,即使在这种情况下,它也可以用于指定其他信息,如上下文参数。如果有一个 Application 类,但是它没有 @ApplicationPath 注解,那么需要一个 web.xml 文件,其中至少有一个 <servlet-mapping> 元素。

Note. 正如在 第 3.1.1 节 “其他 RESTEasy 模块” 中所提到的,并非所有 RESTEasy 模块都与 WildFly 捆绑在一起。例如,resteasy-fastinfoset-provider 和 resteasy-wadl 没有包含在 第 3.1 节 “ WildFly 中的 RESTEasy 模块” 中列出的模块中。如果希望在应用程序中使用它们,可以将它们包含在 WAR 中,就像在 WildFly 之外部署它们一样。有关更多信息,请参见 第 3.3 节 “部署到其他 servlet 容器”

如果你在使用 WildFly 之外的独立 servlet 容器(如 Tomcat 或 Jetty )中使用 RESTEasy,则需要在 WAR 文件中包含适当的 RESTEasy 的jar包。您将需要 resteasy-jaxrs 模块中的核心类,并且可能需要 resteasy-jaxb-provider 模块之类的附加设施。我们强烈建议您使用 Maven 来构建您的 WAR 文件,因为 RESTEasy 被分成了一系列不同的模块:

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-core</artifactId>
    <version>4.7.0-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxb-provider</artifactId>
    <version>4.7.0-SNAPSHOT</version>
</dependency>

你可以在 https://github.com/resteasy/resteasy-examples 中看到 Maven 项目的示例。

如果您没有使用 Maven 构建项目,您可以手动引入所需的jar包。如果您下载 RESTEasy (例如从 http://resteasy.jboss.org/downloads.html 下载) ,您将得到一个类似 resteasy-jaxrs-<version>-all.zip 的文件。如果将其解压缩,您将看到一个 lib/ 目录,其中包含 RESTEasy 所需的库。根据需要将这些文件复制到 /WEB-INF/lib 目录中。将您的 JAX-RS 注解类资源和提供程序放在/WEB-INF/lib 中的一个或多个 jar 中,或放在 /WEB-INF/classes 中的原始类文件中。

resteasy-servlet-initializer 组件不会在3.0以下的 Servlet 版本中工作。然后,您必须在 WAR 项目的 WEB-INF/web.xml 文件中手动声明 RESTEasy servlet,并且必须使用 Application 类(参见 第 3.6 节 “javax.ws.rs.core.Application”) 显式列出资源和提供程序。例如:

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

    <servlet>
        <servlet-name>Resteasy</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
        </servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.restfully.shop.services.ShoppingApplication</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>Resteasy</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

RESTEasy servlet 负责初始化 RESTEasy 的一些基本组件。

Note. 对3.0之前的 Servlet 规范的支持可能会被弃用,并最终被淘汰。

RESTEasy 有两种相互排斥的检索配置参数的机制(参见第 3.5 节 “配置开关”)。传统的机制依赖于 web.xml 文件中的 context-params 和 init-params 配置。或者,Eclipse MicroProfile Config 项目(https://github.com/eclipse/microprofile-config)提供了一种灵活的参数检索机制,如果必要的依赖项可用,RESTEasy 将使用这种机制。请参见第 3.4.4 节 “配置 MicroProfile Config” 以获得更多信息。如果它们不可用,就会退回到传统机制的扩展形式。

在有 Eclipse MicroProfile Config API 的 jar 包和 API (见 第 3.4.4 节 “配置 MicroProfile Config”)相关实现的情况下 ,RESTEasy 将使用 MicroProfile Config 的工具访问配置属性(见 第 3.5 节 “配置开关”)。MicroProfile Config 为 RESTEasy 用户和 RESTEasy 开发人员提供了很大的灵活性来控制运行时配置。

在 MicroProfile Config 中,ConfigSource 是一个Map<String, String> 表示属性名称到值的映射,Config 表示按优先级排序的 ConfigSource 序列。ConfigSource 的优先级由ordinal变量(用 int 表示)给出,较高的数值表示较高的优先级。对于给定的属性名,将按顺序搜索 ConfigSource,直到找到值为止。

MicroProfile Config 指定了以下的 ConfigSource:

  1. 一个 ConfigSource 来自于 System.getProperties() (ordinal = 400)
  2. 一个 ConfigSource 来自于 System.getenv() (ordinal = 300)
  3. 一个 ConfigSource 来自ClassPath中的每个 META-INF/microprofile-config.properties 文件,可以通过每个文件中的 config_ordinal 属性单独配置优先级。(默认的 ordinal = 100)

注意,由于 ConfigSource 的相对优先级,在 System properties 中找到的属性以及在 System environment 中找到的属性将被赋予 System properties 值。

ConfigSources 的set集合是可扩展的。例如,目前 RESTEasy 使用的 MicroProfile Config 规范的实现 smallrye-Config (https://github.com/smallrye/smallrye-config) ,添加了以下几种 ConfigSource:

  1. PropertiesConfigSource 创建一个 ConfigSource 来自 Java Properties 对象或者一个 Map<String, String> 对象或者一个 properties 文件 (由其 URL 引用) (默认 ordinal = 100)。
  2. DirConfigSource 创建一个ConfigSource,它将查看一个目录,每个文件对应一个属性(文件名是属性键,其文本内容是属性值)。 该ConfigSource 可用于从Kubernetes ConfigMap读取配置(默认 ordinal = 100 )。
  3. ZkMicroProfileConfig 创建一个 ConfigSource,该ConfigSource通过 Apache Zookeeper 备份 (ordinal = 150).

这些可以通过使用 ConfigProviderResolver 实例以编程方式注册:

Config config = new PropertiesConfigSource("file:/// ...");
ConfigProviderResolver.instance().registerConfig(config, getClass().getClassLoader());
        

其中 ConfigProviderResolver 是 Eclipse API 的一部分。

如果应用程序在 WildFly 运行,那么 WildFly 提供了另一组 ConfigSource ,正如 WildFly 管理指南(https://docs.wildfly.org/21/Admin_Guide.html#MicroProfile_Config_SmallRye )的"MicroProfile Config Subsystem Configuration" 部分所描述的那样。

最后,RESTEasy 自动提供了三个ConfigSource:

  • org.jboss.resteasy.microprofile.config.ServletConfigSource 表示 servlet 在 web.xml 中的 <init-param>s 配置 (ordinal = 60)。
  • org.jboss.resteasy.microprofile.config.FilterConfigSource 表示 servlet 在 web.xml 中的 <init-param>s 配置 (ordinal = 50)。 (见 第 3.8 节 “RESTEasy 作为 Servlet Filter” for more information.)
  • org.jboss.resteasy.microprofile.config.ServletContextConfigSource 表示 web.xml 中的 <context-param>s 配置 (ordinal = 40)。

Note. 正如 MicroProfile Config 规范所述,可以在任何 RESTEasy 内置 ConfigSource 中设置一个特殊属性 config_ordinal 。getOrdinal() 的默认实现将尝试读取此值。如果找到并且是一个有效的整数,则将使用该值。否则将使用相应的默认值。

RESTEasy 提供了一个通用的参数检索机制,如果有必要的依赖关系可用,它就会包含 MicroProfile Config,否则就会回到经典 RESTEasy 机制的扩展版本(见 第 3.4.5 节 “RESTEasy 的经典配置机制 ”)。

调用

ConfigurationFactory.getInstance().getConfiguration()
            

将返回一个 org.jboss.resteasy.spi.config.Configuration 的实例:

public interface Configuration {

    /**
     * Returns the resolved value for the specified type of the named property.
     *
     * @param name the name of the parameter
     * @param type the type to convert the value to
     * @param <T>  the property type
     *
     * @return the resolved optional value
     *
     * @throws IllegalArgumentException if the type is not supported
     */
    <T> Optional<T> getOptionalValue(String name, Class<T> type);

    /**
     * Returns the resolved value for the specified type of the named property.
     *
     * @param name the name of the parameter
     * @param type the type to convert the value to
     * @param <T>  the property type
     *
     * @return the resolved value
     *
     * @throws IllegalArgumentException         if the type is not supported
     * @throws java.util.NoSuchElementException if there is no property associated with the name
     */
    <T> T getValue(String name, Class<T> type);
}
            

举个例子:

String value = ConfigurationFactory.getInstance().getConfiguration().getOptionalValue("prop_name", String.class).orElse("d'oh");
        

如果 MicroProfile Config 是可用的,那么它等价于

String value = ConfigProvider.getConfig().getOptionalValue("prop_name", String.class).orElse("d'oh");
        

如果 MicroProfile Config 不可用,则尝试从以下源检索该参数:

  1. 系统变量,然后是
  2. 环境变量,然后是
  3. 通过 web.xml 文件配置, 如 第 3.4.5 节 “RESTEasy 的经典配置机制 ” 中所述

在加入 MicroProfile Config 之前,几乎所有 RESTEasy 的参数都是从 servlet init-params 和 context-params 中检索到的。哪些是可用的取决于 web 应用程序如何调用 RESTEasy。

如果 RESTEasy 被作为 servlet 调用,如

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

   <context-param>
      <param-name>system</param-name>
      <param-value>system-context</param-value>
   </context-param>
   
   <servlet>
      <servlet-name>Resteasy</servlet-name>
      <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher</servlet-class>

      <init-param>
         <param-name>system</param-name>
         <param-value>system-init</param-value>
      </init-param>
      
   </servlet>

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

然后可以使用 servlet 特定的 init-params 和一般的 context-params,前者优先于后者。例如,属性"system"的值为"system-init"。

如果通过过滤器调用 RESTEasy (参见 第 3.8 节 “RESTEasy 作为 Servlet Filter”) ,如下所示

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

   <context-param>
      <param-name>system</param-name>
      <param-value>system-context</param-value>
   </context-param>

   <filter>
      <filter-name>Resteasy</filter-name>
      <filter-class>org.jboss.resteasy.plugins.server.servlet.FilterDispatcher</filter-class>

      <init-param>
         <param-name>system</param-name>
         <param-value>system-filter</param-value>
      </init-param>

    </filter>

    <filter-mapping>
        <filter-name>Resteasy</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>
   

然后可以使用筛选器特定的 init-params 和一般的 context-params,前者优先于后者。例如,属性"system"的值为"system-filter"。

最后,如果 RESTEasy 是通过 ServletContextListener 调用的(参见 第 3.7 节 “RESTEasy 作为 ServletContextListener”) ,如下所示

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

   <listener>
      <listener-class>
         org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
      </listener-class>
   </listener>

   <context-param>
      <param-name>system</param-name>
      <param-value>system-context</param-value>
   </context-param>
</web-app>

其中 ResteasyBootstrap 是一个 ServletContextListener,那么 context-params 是可用的。

运行时可以从可用的任何 ConfigSource 接收以下配置选项:

表 3.2. 

配置选项 默认值 描述
resteasy.servlet.mapping.prefix no default If the url-pattern for the RESTEasy servlet-mapping is not /*
resteasy.providers no default A comma delimited list of fully qualified @Provider class names you want to register
resteasy.use.builtin.providers true Whether or not to register default, built-in @Provider classes
resteasy.resources no default A comma delimited list of fully qualified JAX-RS resource class names you want to register
resteasy.jndi.resources no default A comma delimited list of JNDI names which reference objects you want to register as JAX-RS resources
javax.ws.rs.Application no default Fully qualified name of Application class to bootstrap in a spec portable way
resteasy.media.type.mappings no default Replaces the need for an Accept header by mapping file name extensions (like .xml or .txt) to a media type. Used when the client is unable to use an Accept header to choose a representation (i.e. a browser). See 第 20 章 JAX-RS 内容协商 for more details.
resteasy.language.mappings no default Replaces the need for an Accept-Language header by mapping file name extensions (like .en or .fr) to a language. Used when the client is unable to use an Accept-Language header to choose a language (i.e. a browser). See 第 20 章 JAX-RS 内容协商 for more details.
resteasy.media.type.param.mapping no default Names a query parameter that can be set to an acceptable media type, enabling content negotiation without an Accept header. See 第 20 章 JAX-RS 内容协商 for more details.
resteasy.role.based.security false Enables role based security. See 第 43 章 Securing JAX-RS and RESTEasy for more details.
resteasy.document.expand.entity.references false Expand external entities in org.w3c.dom.Document documents and JAXB object representations
resteasy.document.secure.processing.feature true Impose security constraints in processing org.w3c.dom.Document documents and JAXB object representations
resteasy.document.secure.disableDTDs true Prohibit DTDs in org.w3c.dom.Document documents and JAXB object representations
resteasy.wider.request.matching false Turns off the JAX-RS spec defined class-level expression filtering and instead tries to match version every method's full path.
resteasy.use.container.form.params false Obtain form parameters by using HttpServletRequest.getParameterMap(). Use this switch if you are calling this method within a servlet filter or eating the input stream within the filter.
resteasy.rfc7232preconditions false Enables RFC7232 compliant HTTP preconditions handling.
resteasy.gzip.max.input 10000000 Imposes maximum size on decompressed gzipped .
resteasy.secure.random.max.use 100 The number of times a SecureRandom can be used before reseeding.
resteasy.buffer.exception.entity true Upon receiving an exception, the client side buffers any response entity before closing the connection.
resteasy.add.charset true If a resource method returns a text/* or application/xml* media type without an explicit charset, RESTEasy will add "charset=UTF-8" to the returned Content-Type header. Note that the charset defaults to UTF-8 in this case, independent of the setting of this parameter.
resteasy.disable.html.sanitizer false Normally, a response with media type "text/html" and a status of 400 will be processed so that the characters "/", "<", ">", "&", """ (double quote), and "'" (single quote) are escaped to prevent an XSS attack. If this parameter is set to "true", escaping will not occur.
resteasy.patchfilter.disabled false Turns off the default patch filter to handle JSON patch and JSON Merge Patch request. A customerized patch method filter can be provided to serve the JSON patch and JSON merge patch request instead.
resteasy.original.webapplicationexception.behavior false When set to "true", this parameter will restore the original behavior in which a Client running in a resource method will throw a JAX-RS WebApplicationException instead of a Resteasy version with a sanitized Response. For more information, see section Resteasy WebApplicationExceptions


Note. 如果你的 RESTEasy servlet 设置的 servlet-mapping 有一个除 /* 外的 url-pattern,你必须设置 resteasy.servlet.mapping.prefix <context param> 变量。如下:

<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/restful-services/*</url-pattern>
</servlet-mapping>

那么 resteasy.servlet.mapping.prefix 的值必须是:

<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/restful-services</param-value>
</context-param>

javax.ws.rs.core.Application 类是一个标准的 JAX-RS 类,您可以用它来提供有关部署的信息。它只是一个列出所有 JAX-RS 根资源和提供程序的类。

/**
* Defines the components of a JAX-RS application and supplies additional
* metadata. A JAX-RS application or implementation supplies a concrete
* subclass of this abstract class.
*/
public abstract class Application
{
    private static final Set<Object> emptySet = Collections.emptySet();

    /**
    * Get a set of root resource and provider classes. The default lifecycle
    * for resource class instances is per-request. The default lifecycle for
    * providers is singleton.
    * <p/>
    * <p>Implementations should warn about and ignore classes that do not
    * conform to the requirements of root resource or provider classes.
    * Implementations should warn about and ignore classes for which
    * {@link #getSingletons()} returns an instance. Implementations MUST
    * NOT modify the returned set.</p>
    *
    * @return a set of root resource and provider classes. Returning null
    * is equivalent to returning an empty set.
    */
    public abstract Set<Class<?>> getClasses();

    /**
    * Get a set of root resource and provider instances. Fields and properties
    * of returned instances are injected with their declared dependencies
    * (see {@link Context}) by the runtime prior to use.
    * <p/>
    * <p>Implementations should warn about and ignore classes that do not
    * conform to the requirements of root resource or provider classes.
    * Implementations should flag an error if the returned set includes
    * more than one instance of the same class. Implementations MUST
    * NOT modify the returned set.</p>
    * <p/>
    * <p>The default implementation returns an empty set.</p>
    *
    * @return a set of root resource and provider instances. Returning null
    * is equivalent to returning an empty set.
    */
    public Set<Object> getSingletons()
    {
        return emptySet;
    }

}            

Note. 如果 web.xml 文件没有 <servlet-mapping> 元素,则必须使用带有@ApplicationPath 注解的 Application 类。

如果您使用的是 Servlet 3.0 或更高版本的容器,那么这一部分几乎是不推荐的。如果是,并且阅读了上面关于在 Servlet 3.0 中安装的配置部分,那请跳过这一小节。RESTEasy 的初始化可以在 ServletContextListener 中执行,而不是在 Servlet 中执行。如果您正在编写需要在启动时与 RESTEasy 进行交互的自定义 Listeners,那么您可能需要这个。这方面的一个例子是 RESTEasy 与 Spring 框架的集成,org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap 类是一个 ServletContextListener,它配置 ResteasyProviderFactory 和 Registry 的实例。可以从 ServletContext 属性 org.jboss.resteasy.spi.ResteasyProviderFactory 和 org.jboss.resteasy.spi.Registry 获取 ResteasyProviderFactory 和 Registry 的实例。从这些实例中,您可以通过编程方式与 RESTEasy 注册接口交互。

<web-app>
   <listener>
      <listener-class>
         org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
      </listener-class>
   </listener>

  <!-- ** INSERT YOUR LISTENERS HERE!!!! -->

   <servlet>
      <servlet-name>Resteasy</servlet-name>
      <servlet-class>
         org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
      </servlet-class>
   </servlet>

   <servlet-mapping>
      <servlet-name>Resteasy</servlet-name>
      <url-pattern>/Resteasy/*</url-pattern>
   </servlet-mapping>

</web-app>

如果您使用的是 Servlet 3.0 或更高版本的容器,那么这一部分几乎是不推荐的。如果是,并且阅读了上面关于在 Servlet 3.0 中安装的配置部分,那请跳过这一小节。作为一个 Servlet 运行 RESTEasy 的缺点是,您不能在JAX-RS 服务相同路径下放置静态资源如 .html 和 .jpeg 文件。RESTEasy 允许您以 Filter 的形式运行。如果在请求的 URL 下面没有找到 JAX-RS 资源,RESTEasy 将委托回 servlet 容器以解析 URL。

<web-app>
    <filter>
        <filter-name>Resteasy</filter-name>
        <filter-class>
            org.jboss.resteasy.plugins.server.servlet.FilterDispatcher
        </filter-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.restfully.shop.services.ShoppingApplication</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>Resteasy</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

基于 JAX-RS 2.0 的 RESTEasy 等实现支持客户端框架,简化了与 restful 应用程序的通信。在 RESTEasy 中,客户机框架所需的最小模块集由 resteasy-core 和 resteasy-client 组成。你可以通过 maven 访问它们:

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-core</artifactId>
    <version>4.7.0-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-client</artifactId>
    <version>4.7.0-SNAPSHOT</version>
</dependency>

其他模块,如 resteasy-jaxb-provider ,可以根据需要引入。