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