61.8. 동적 바인딩

61.8.1. 개요

컨테이너 필터 및 컨테이너 인터셉터를 리소스에 바인딩하는 표준 방법은 @Provider 주석을 사용하여 필터 및 인터셉터에 주석을 추가하는 것입니다. 이렇게 하면 바인딩이 global: 즉, 필터 및 인터셉터가 서버 측의 모든 리소스 클래스 및 리소스 메서드에 바인딩됩니다.

동적 바인딩은 서버 측에서 바인딩하는 대체 방법이므로 인터셉터 및 필터가 적용되는 리소스 방법을 선택하고 선택할 수 있습니다. 필터 및 인터셉터에 대한 동적 바인딩을 활성화하려면 여기에 설명된 대로 사용자 지정 DynamicFeature 인터페이스를 구현해야 합니다.

61.8.2. DynamicFeature 인터페이스

DynamicFeature 인터페이스는 다음과 같이 javax.ws.rx.container 패키지에 정의되어 있습니다.

// Java
package javax.ws.rs.container;

import javax.ws.rs.core.FeatureContext;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.WriterInterceptor;

public interface DynamicFeature {
    public void configure(ResourceInfo resourceInfo, FeatureContext context);
}

61.8.3. 동적 기능 구현

다음과 같이 동적 기능을 구현합니다.

  1. 이전에 설명한 대로 하나 이상의 컨테이너 필터 또는 컨테이너 인터셉터를 구현합니다. 그러나 @Provider 주석으로 주석을 넣지 마십시오(다른 방법으로는 전역적으로 바인딩되어 동적 기능을 효과적으로 관련 없음).
  2. DynamicFeature 클래스를 구현하여 configure 메서드를 재정의하여 고유한 동적 기능을 만듭니다.
  3. configure 메서드에서는 resourceInfo 인수를 사용하여 어떤 리소스 클래스와 이 기능을 호출하는 리소스 메서드를 검색할 수 있습니다.In the configure method, you can use the resourceInfo argument to discover which resource class and which resource method is being called for. 이 정보는 일부 필터 또는 인터셉터를 등록할지 여부를 결정하는 기반으로 사용할 수 있습니다.
  4. 현재 리소스 메서드에 필터 또는 인터셉터를 등록하려면 context.register 메서드 중 하나를 호출하여 이를 수행할 수 있습니다.
  5. 배포 단계 중에 선택되도록 동적 기능 클래스에 @Provider 주석에 주석을 답니다.

61.8.4. 동적 기능 예

다음 예제에서는 @GET: 주석이 달린 MyResource 클래스(또는 하위 클래스)의 모든 메서드에 LoggingFilter 필터를 등록하는 동적 기능을 정의하는 방법을 보여줍니다.

// Java
...
import javax.ws.rs.container.DynamicFeature;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.FeatureContext;
import javax.ws.rs.ext.Provider;

@Provider
public class DynamicLoggingFilterFeature implements DynamicFeature {
  @Override
  void configure(ResourceInfo resourceInfo, FeatureContext context) {
    if (MyResource.class.isAssignableFrom(resourceInfo.getResourceClass())
      && resourceInfo.getResourceMethod().isAnnotationPresent(GET.class)) {
      context.register(new LoggingFilter());
  }
}

61.8.5. 동적 바인딩 프로세스

Cryostat-RS 표준을 사용하려면 DynamicFeature.configure 메서드를 각 리소스 메서드에 대해 정확히 한 번만 호출해야 합니다. 즉, 모든 리소스 방법에는 동적 기능에 의해 설치된 필터 또는 인터셉터가 잠재적으로 있을 수 있지만 각 경우에 필터 또는 인터셉터를 등록할지 여부를 결정하는 동적 기능입니다. 즉, 동적 기능에서 지원하는 바인딩 단위는 개별 리소스 메서드 수준에 있습니다.

61.8.6. FeatureContext 인터페이스

FeatureContext 인터페이스( 구성 메서드에서 필터 및 인터셉터를 등록할 수 있음)는 다음과 같이 Configurable <>의 하위 인터페이스로 정의됩니다.

// Java
package javax.ws.rs.core;

public interface FeatureContext extends Configurable<FeatureContext> {
}

Configurable&lt;> 인터페이스는 다음과 같이 단일 리소스 메서드에 필터 및 인터셉터를 등록하는 다양한 방법을 정의합니다.

// Java
...
package javax.ws.rs.core;

import java.util.Map;

public interface Configurable<C extends Configurable> {
    public Configuration getConfiguration();
    public C property(String name, Object value);
    public C register(Class<?> componentClass);
    public C register(Class<?> componentClass, int priority);
    public C register(Class<?> componentClass, Class<?>... contracts);
    public C register(Class<?> componentClass, Map<Class<?>, Integer> contracts);
    public C register(Object component);
    public C register(Object component, int priority);
    public C register(Object component, Class<?>... contracts);
    public C register(Object component, Map<Class<?>, Integer> contracts);
}