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. 동적 기능 구현
다음과 같이 동적 기능을 구현합니다.
-
이전에 설명한 대로 하나 이상의 컨테이너 필터 또는 컨테이너 인터셉터를 구현합니다. 그러나
@Provider주석으로 주석을 넣지 마십시오(다른 방법으로는 전역적으로 바인딩되어 동적 기능을 효과적으로 관련 없음). -
DynamicFeature클래스를 구현하여configure메서드를 재정의하여 고유한 동적 기능을 만듭니다. -
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. 이 정보는 일부 필터 또는 인터셉터를 등록할지 여부를 결정하는 기반으로 사용할 수 있습니다. -
현재 리소스 메서드에 필터 또는 인터셉터를 등록하려면
context.register메서드 중 하나를 호출하여 이를 수행할 수 있습니다. -
배포 단계 중에 선택되도록 동적 기능 클래스에
@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<> 인터페이스는 다음과 같이 단일 리소스 메서드에 필터 및 인터셉터를 등록하는 다양한 방법을 정의합니다.
// 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);
}