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. 구성 메서드에서 resourceInfo 인수를 사용하여 어떤 리소스 클래스 및 이 기능이 호출되는 리소스 메서드를 검색할 수 있습니다.In the configure method, you can use the resourceInfo argument to discover which resource class and which resource method this feature 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. 동적 바인딩 프로세스

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

61.8.6. FeatureContext 인터페이스

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

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

public interface FeatureContext extends Configurable<FeatureContext> {
}

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

// 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);
}