57.3. 단계에서 인터셉터 배치 구성
57.3.1. 개요
인터셉터를 단계에 배치하면 인터셉터가 제대로 작동하는지 확인하기 위해 배치를 충분히 제어할 수 없습니다. 예를 들어 SAAJ API를 사용하여 메시지의 SOAP 헤더를 검사해야 하는 인터셉터가 있는 경우 메시지를 SAAJ 오브젝트로 변환하는 인터셉터 다음에 실행해야 합니다. 한 인터셉터에서 다른 인터셉터에 필요한 메시지의 일부를 사용하는 경우가 있을 수 있습니다. 이 경우 개발자는 인터셉터 전에 실행해야 하는 인터셉터 목록을 제공할 수 있습니다. 개발자는 인터셉터 후 실행해야 하는 인터셉터 목록을 제공할 수도 있습니다.
런타임은 인터셉터 단계 내에서 이러한 목록만 적용할 수 있습니다. 개발자가 현재 단계 이후에 실행해야 하는 인터셉터 목록에 이전 단계의 인터셉터를 배치하면 런타임에서 요청을 무시합니다.
57.3.2. 체인 앞에 추가
인터셉터를 개발할 때 발생하는 한 가지 문제는 인터셉터에 필요한 데이터가 항상 존재하지 않는다는 것입니다. 이 문제는 체인의 하나의 인터셉터가 이후 인터셉터에 필요한 메시지 데이터를 사용하는 경우 발생할 수 있습니다. 개발자는 인터셉터를 수정하여 사용자 정의 인터셉터를 제어하고 문제를 해결할 수 있습니다. 그러나 Apache CXF에서 여러 인터셉터를 사용하고 개발자가 수정할 수 없기 때문에 이 방법이 항상 가능한 것은 아닙니다.
대체 솔루션은 사용자 정의 인터셉터에 필요한 메시지 데이터를 사용할 인터셉터 전에 사용자 정의 인터셉터를 배치하는 것입니다. 가장 쉬운 방법은 이전 단계에서 배치하는 것이지만 항상 가능한 것은 아닙니다. Apache CXF의 AbstractPhaseInterceptor
클래스에서 두 개의 addBefore()
메서드를 하나 이상 제공하기 전에 인터셉터를 배치해야 하는 경우.
예 57.2. “다른 인터셉터 전에 인터셉터를 추가하는 방법” 에 표시된 대로 단일 인터셉터 ID를 사용하고 다른 하나는 인터셉터 ID 컬렉션을 가져옵니다. 여러 개의 호출을 수행하여 인터셉터를 계속 목록에 추가할 수 있습니다.
예 57.2. 다른 인터셉터 전에 인터셉터를 추가하는 방법
publicaddBefore
String
i
publicaddBefore
Collection<String>
i
예 57.3. “현재 인터셉터 후 실행해야 하는 인터셉터 목록 지정” 에 표시된 대로 개발자는 사용자 지정 인터셉터의 constuctor에서 addBefore()
메서드를 호출합니다.
예 57.3. 현재 인터셉터 후 실행해야 하는 인터셉터 목록 지정
public class MyPhasedOutInterceptor extends AbstractPhaseInterceptor
{
public MyPhasedOutInterceptor() {
super(Phase.PRE_LOGICAL);
addBefore(HolderOutInterceptor.class.getName());
}
...
}
대부분의 인터셉터는 인터셉터 ID에 클래스 이름을 사용합니다.
57.3.3. 다음으로 체인을 추가합니다.
인터셉터에 필요한 데이터가 존재하지 않는 또 다른 이유는 데이터가 메시지 오브젝트에 배치되지 않았기 때문입니다. 예를 들어 인터셉터는 메시지 데이터를 SOAP 메시지로 사용하여 작업하려고 할 수 있지만 메시지가 SOAP 메시지로 전환되기 전에 체인에 배치되면 작동하지 않습니다. 개발자는 인터셉터를 수정하여 사용자 정의 인터셉터를 제어하고 문제를 해결할 수 있습니다. 그러나 Apache CXF에서 여러 인터셉터를 사용하고 개발자가 수정할 수 없기 때문에 이 방법이 항상 가능한 것은 아닙니다.
대체 솔루션은 사용자 정의 인터셉터가 인터셉터 또는 인터셉터 뒤에 배치되었는지 확인하여 사용자 정의 인터셉터에 필요한 메시지를 생성하는 것입니다. 가장 쉬운 방법은 나중 단계에서 배치하는 것이지만 항상 가능한 것은 아닙니다. AbstractPhaseInterceptor
클래스는 인터셉터를 하나 이상의 다른 인터셉터 후에 배치해야 하는 경우를 위해 두 개의 addAfter()
메서드를 제공합니다.
예 57.4. “다른 인터셉터 후 인터셉터 추가 방법” 에 표시된 대로 한 가지 방법은 단일 인터셉터 ID를 사용하고 다른 방법은 인터셉터 ID 컬렉션을 가져옵니다. 여러 개의 호출을 수행하여 인터셉터를 계속 목록에 추가할 수 있습니다.
예 57.4. 다른 인터셉터 후 인터셉터 추가 방법
publicaddAfter
String
i
publicaddAfter
Collection<String>
i
예 57.5. “현재 인터셉터 전에 실행해야 하는 인터셉터 목록 지정” 에 표시된 대로 개발자는 사용자 지정 인터셉터의 constuctor에서 addAfter()
메서드를 호출합니다.
예 57.5. 현재 인터셉터 전에 실행해야 하는 인터셉터 목록 지정
public class MyPhasedOutInterceptor extends AbstractPhaseInterceptor
{
public MyPhasedOutInterceptor() {
super(Phase.PRE_LOGICAL);
addAfter(StartingOutInterceptor.class.getName());
}
...
}
대부분의 인터셉터는 인터셉터 ID에 클래스 이름을 사용합니다.