2.18. リソースメタデータを変更する RESTEasy SPI

JBoss EAP は、ResourceBuilder を使用して作成されるリソースクラスメタデータを編集するための RESTEasy サービスプロバイダーインターフェイス (SPI) を提供します。JAX-RS デプロイメントを処理する場合、RESTEasy は ResourceBuilder を使用して各 JAX-RS リソースのメタデータを作成します。このようなメタデータは、特に ResourceClass インターフェイスで org.jboss.resteasy.spi.metadata パッケージのメタデータ SPI を使用して定義されます。

package org.jboss.resteasy.spi.metadata;

public interface ResourceClass
{
  String getPath();

  Class<?> getClazz();

  ResourceConstructor getConstructor();

  FieldParameter[] getFields();

  SetterParameter[] getSetters();

  ResourceMethod[] getResourceMethods();

  ResourceLocator[] getResourceLocators();
}

RESTasy では、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 メディアタイプの変更。