2.18. 用于修改资源元数据的 RESTEasy SPI
JBoss EAP 提供 RESTEasy 服务提供商接口(SPI),用于修改使用 ResourceBuilder
创建的资源类元数据。在处理 JAX-RS 部署时,RESTEasy 使用 ResourceBuilder
为各个 JAX-RS 资源创建元数据。此类元数据使用软件包 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(); }
RESTEasy 允许通过提供 ResourceClassProcessor
接口的实施来自定义元数据生成。以下示例演示了这个 SPI 的用法:
package org.jboss.resteasy.test.core.spi.resource; import org.jboss.logging.Logger; import org.jboss.resteasy.spi.metadata.ResourceClass; import org.jboss.resteasy.spi.metadata.ResourceClassProcessor; import javax.ws.rs.ext.Provider; @Provider public class ResourceClassProcessorImplementation implements ResourceClassProcessor { protected static final Logger logger = Logger.getLogger(ResourceClassProcessorImplementation.class.getName()); @Override public ResourceClass process(ResourceClass clazz) { logger.info(String.format("ResourceClassProcessorImplementation#process method called on class %s", clazz.getClazz().getSimpleName())); String clazzName = clazz.getClazz().getSimpleName(); if (clazzName.startsWith("ResourceClassProcessorEndPoint") || clazzName.equals("ResourceClassProcessorProxy") || clazzName.equals("ResourceClassProcessorProxyEndPoint")) { return new ResourceClassProcessorClass(clazz); } return clazz; }
使用 ResteasyProviderFactory
类存储的新处理器作为常规的 JAX-RS 标注的提供程序解析。它们允许使用可用于各种高级场景的自定义版本嵌套资源元数据类,例如:
- 向资源中添加其他资源方法或定位器.
- 修改 HTTP 方法.
-
修改
@Produces 或
@Consumes
媒体类型.