JBoss.orgCommunity Documentation

第 19 章 Resources 元数据配置

在处理 JAX-RS 部署时,RESTEasy 依赖 ResourceBuilder 为每个 JAX-RS resource 创建元数据。这样的元数据是使用包 org.jboss.resteasy.spi.metadata 中的元数据 SPI 定义的,特别是 ResourceClass 接口:

package org.jboss.resteasy.spi.metadata;

public interface ResourceClass
{
  String getPath();

  Class<?> getClazz();

  ResourceConstructor getConstructor();

  FieldParameter[] getFields();

  SetterParameter[] getSetters();

  ResourceMethod[] getResourceMethods();

  ResourceLocator[] getResourceLocators();
}

在定义元数据 SPI 的其他类和接口中,以下接口值得一提:

public interface ResourceConstructor
{
  ResourceClass getResourceClass();

  Constructor getConstructor();

  ConstructorParameter[] getParams();
}

public interface ResourceMethod extends ResourceLocator
{
  Set<String> getHttpMethods();

  MediaType[] getProduces();

  MediaType[] getConsumes();

  boolean isAsynchronous();

  void markAsynchronous();
}

public interface ResourceLocator
{
  ResourceClass getResourceClass();

  Class<?> getReturnType();

  Type getGenericReturnType();

  Method getMethod();

  Method getAnnotatedMethod();

  MethodParameter[] getParams();

  String getFullpath();

  String getPath();

}

现在,有趣的一点是 RESTEasy 允许通过提供 ResourceClassProcessor 接口的实现来调优元数据生成:

package org.jboss.resteasy.spi.metadata;

public interface ResourceClassProcessor
{

  /**
   * Allows the implementation of this method to modify the resource metadata represented by
   * the supplied {@link ResourceClass} instance. Implementation will typically create
   * wrappers which modify only certain aspects of the metadata.
   *
   * @param clazz The original metadata
   * @return the (potentially modified) metadata (never null)
   */
  ResourceClass process(ResourceClass clazz);

}

这些处理器应该是并且被解析为常规的带 JAX-RS 注释的提供程序。它们允许用自定义版本包装资源元数据类,这些版本可用于各种高级场景,如

  • 向resource添加额外的resource 方法/定位器
  • 修改 http 方法
  • 修改 @Produces / @Consumes 媒体类型
  • ...