57.3. 단계에서 인터셉터 배치 제한
57.3.1. 개요
인터셉터를 단계에 배치하면 인터셉터가 제대로 작동하는지 확인하기 위해 배치에 대한 충분한 제어 기능을 제공하지 못할 수 있습니다. 예를 들어, SAAJ API를 사용하여 메시지의 Cryostat 헤더를 검사해야 하는 인터셉터가 메시지를 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. 다음 체인에 추가
인터셉터에 필요한 데이터가 없는 또 다른 이유는 데이터가 메시지 오브젝트에 배치되지 않았기 때문입니다. 예를 들어 인터셉터는 메시지 데이터를 Cryostat 메시지로 사용하여 작업하려고 할 수 있지만 메시지를 message로 전환하기 전에 체인에 배치되면 작동하지 않습니다. 개발자는 사용자 정의 인터셉터가 사용하는 것을 제어하고 인터셉터를 수정하여 문제를 해결할 수 있습니다. 그러나 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에 클래스 이름을 사용합니다.