46.6. 리소스 선택 방법
46.6.1. 개요
지정된 URI가 하나 이상의 리소스 메서드에 매핑될 수 있습니다. 예를 들어 URI customerservice/12/ma 는 @Path("customerservice/{id}")
또는 @Path("customerservice/{id}/{state}")
템플릿과 일치할 수 있습니다. Cryostat-RS는 리소스 메서드를 요청과 일치시키기 위한 자세한 알고리즘을 지정합니다. 알고리즘은 정규화된 URI, HTTP 동사, 요청 및 응답 엔터티의 미디어 유형을 리소스 클래스의 주석과 비교합니다.
46.6.2. 기본 선택 알고리즘
Cryostat-RS 선택 알고리즘은 다음 세 단계로 나뉩니다.
루트 리소스 클래스를 확인합니다.
요청 URI는
@Path
주석으로 데코레이팅된 모든 클래스와 일치합니다.@Path
주석이 요청 URI와 일치하는 클래스가 결정됩니다.리소스 클래스의
@Path
주석 값이 전체 요청 URI와 일치하면 클래스의 메서드가 세 번째 단계에 대한 입력으로 사용됩니다.오브젝트가 요청을 처리할지 확인합니다.
요청 URI가 선택한 클래스의
@Path
주석 값보다 길면 리소스 메서드의@Path
주석 값이 요청을 처리할 수 있는 하위 리소스를 찾는 데 사용됩니다.하나 이상의 하위 리소스 메서드가 요청 URI와 일치하는 경우 이러한 메서드는 세 번째 단계에 대한 입력으로 사용됩니다.
요청 URI에 대한 유일한 항목이 하위 리소스 검색기인인 경우 요청 URI와 일치하도록 하위 리소스 검색기에서 생성한 오브젝트의 리소스 메서드입니다. 이 단계는 하위 리소스 메서드가 요청 URI와 일치할 때까지 반복됩니다.
요청을 처리할 리소스 메서드를 선택합니다.
HTTP 동사 주석이 요청의 HTTP 동사와 일치하는 리소스 메서드입니다. 또한 선택한 리소스 메서드는 요청 엔티티 본문의 미디어 유형을 수락하고 요청에 지정된 미디어 유형을 따르는 응답을 생성할 수 있어야 합니다.
46.6.3. 여러 리소스 클래스에서 선택
선택 알고리즘의 처음 두 단계에 따라 요청을 처리할 리소스가 결정됩니다. 경우에 따라 리소스는 리소스 클래스로 구현됩니다. 다른 경우에는 동일한 URI 템플릿을 사용하는 하나 이상의 하위 리소스로 구현됩니다. 요청 URI와 일치하는 리소스가 여러 개 있는 경우 리소스 클래스가 하위 리소스보다 우선합니다.
리소스 클래스와 하위 리소스 간에 정렬한 후 두 개 이상의 리소스가 요청 URI와 일치하는 경우 다음 기준이 단일 리소스를 선택하는 데 사용됩니다.
URI 템플릿에서 리터럴 문자가 가장 많은 리소스를 선호합니다.
리터럴 문자는 템플릿 변수의 일부가 아닌 문자입니다. 예를 들어 /widgets/{id}/{color} 에는 10개의 리터럴 문자가 있으며 /widgets/1/{color} 에는 7개의 리터럴 문자가 있습니다. 따라서 요청 URI /widgets/1/red 가 URI 템플릿으로 /widgets/1/{color} 인 리소스와 일치합니다.
참고후행 슬래시(
/
)는 리터럴 문자로 간주됩니다. 따라서 /joefred/ 는 /joefred 보다 우선합니다.URI 템플릿에서 가장 많은 변수가 있는 리소스를 선호합니다.
요청 URI /widgets/30/green 은 /widgets/{id}/{color} 및 /widgets/{amount}/ 와 모두 일치할 수 있습니다. 그러나 URI 템플릿 /widgets/{id}/{color} 가 있는 리소스는 두 개의 변수가 있으므로 선택됩니다.
정규식을 포함하는 가장 많은 변수가 있는 리소스를 선호합니다.
요청 URI /widgets/30/green 은 /widgets/{number}/{ color} 및 /widgets/{id:.}/{ color}*와 모두 일치할 수 있습니다. 그러나 URI 템플릿 */widgets/{id:.}/{color} 가 있는 리소스는 정규식이 포함된 변수가 있기 때문에 선택됩니다.
46.6.4. 여러 리소스 방법에서 선택
대부분의 경우 요청 URI와 일치하는 리소스를 선택하면 요청을 처리할 수 있는 단일 리소스 메서드가 생성됩니다. 방법은 요청에 지정된 HTTP 동사와 리소스 메서드의 HTTP 동사 주석을 일치시켜 결정됩니다. 적절한 HTTP 동사 주석 외에도 선택한 방법은 요청에 포함된 요청 엔티티를 처리하고 요청의 메타데이터에 지정된 적절한 유형의 응답을 생성할 수 있어야 합니다.
리소스 메서드가 처리할 수 있는 요청 엔티티 유형은 @Consumes
주석으로 지정됩니다. 리소스 메서드에서 생성할 수 있는 응답 유형은 @Produces
주석을 사용하여 지정합니다.
리소스를 선택할 때 요청을 처리할 수 있는 여러 메서드를 생성할 때 다음 기준이 요청을 처리할 리소스 메서드를 선택하는 데 사용됩니다.
- 하위 리소스에 대한 리소스 메서드를 선호합니다.
- 하위 리소스 검색기에 비해 하위 리소스 메서드를 선호합니다.
@Consumes
주석과@Produces
주석에서 가장 구체적인 값을 사용하는 메서드를 선호합니다.예를 들어 주석이
@Consumes("text/xml")
인 메서드는@Consumes("text/*")
주석이 있는 메서드보다 우선합니다. 두 방법 모두@Consumes
주석이나 주석@Consumes("\*/*")
없이 메서드보다 우선합니다.요청 본문 엔티티의 콘텐츠 유형과 가장 밀접하게 일치하는 메서드를 선호합니다.
참고요청 본문 엔티티의 콘텐츠 유형은 HTTP
Content-Type
속성에 지정됩니다.응답으로 허용되는 콘텐츠 유형과 가장 근접하게 일치하는 방법을 선호합니다.
참고응답으로 허용되는 콘텐츠 유형은 HTTP
Accept
속성에 지정됩니다.
46.6.5. 선택 프로세스 사용자 정의
경우에 따라 개발자는 여러 리소스 클래스를 선택하는 방식에서 알고리즘이 다소 제한적인 경우가 있습니다. 예를 들어 지정된 리소스 클래스가 일치하고 이 클래스에 일치하는 리소스 메서드가 없는 경우 알고리즘의 실행이 중지됩니다. 일치하는 나머지 리소스 클래스를 확인하지 않습니다.
Apache CXF는 런타임에서 일치하는 여러 리소스 클래스를 사용자 지정하는 데 사용할 수 있는 org.apache.cxf.jaxrs.ext.ResourceComparator 인터페이스를 제공합니다. 예 46.9. “리소스 선택을 사용자 정의하는 인터페이스” 에 표시된 ResourceComparator 인터페이스는 구현해야 하는 방법이 있어야 합니다. 하나는 두 리소스 클래스를 비교하고 다른 하나는 두 리소스 메서드를 비교합니다.
예 46.9. 리소스 선택을 사용자 정의하는 인터페이스
package org.apache.cxf.jaxrs.ext; import org.apache.cxf.jaxrs.model.ClassResourceInfo; import org.apache.cxf.jaxrs.model.OperationResourceInfo; import org.apache.cxf.message.Message; public interface ResourceComparator { int compare(ClassResourceInfo cri1, ClassResourceInfo cri2, Message message); int compare(OperationResourceInfo oper1, OperationResourceInfo oper2, Message message); }
사용자 지정 구현은 다음과 같이 두 리소스 간에 선택합니다.
-
첫 번째 매개 변수가 두 번째 매개변수보다 일치하는 경우
1
을 반환합니다. -
두 번째 매개 변수가 첫 번째 매개변수보다 일치하는 경우
-1
을 반환합니다.
0
이 반환되면 런타임은 기본 선택 알고리즘을 진행합니다.
서비스의 jaxrs:server
요소에 resourceComparator
자식을 추가하여 사용자 지정 ResourceComparator 구현을 등록합니다.