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媒体类型.