46.6. 리소스 선택 방법
46.6.1. 개요
지정된 URI를 하나 이상의 리소스 메서드에 매핑할 수 있습니다. 예를 들어 URI 고객 서비스/12/ma 는 템플릿 @Path("customerservice/{id}")
또는 @Path("customerservice/{id}/{state}")
와 일치할 수 있습니다. JAX-RS는 리소스 메서드를 요청과 일치하는 세부 알고리즘을 지정합니다. 알고리즘은 정규화된 URI, HTTP 동사 및 요청 및 응답 엔터티의 미디어 유형을 리소스 클래스의 주석과 비교합니다.
46.6.2. 기본 선택 알고리즘
JAX-RS 선택 알고리즘은 다음 세 단계로 나뉩니다.
루트 리소스 클래스를 결정합니다.
요청 URI는
@Path
주석으로 장식되는 모든 클래스와 일치합니다.@Path
주석이 요청 URI와 일치하는 클래스가 결정됩니다.리소스 클래스의
@Path
주석 값이 전체 요청 URI와 일치하는 경우 클래스의 메서드가 세 번째 단계에 대한 입력으로 사용됩니다.개체가 요청을 처리할지 결정합니다.
요청 URI가 선택한 클래스의
@Path
주석 값보다 긴 경우 리소스 메서드의@Path
주석 값이 요청을 처리할 수 있는 하위 리소스를 찾는 데 사용됩니다.하나 이상의 하위 리소스 메서드가 요청 URI와 일치하는 경우 이러한 메서드는 세 번째 단계의 입력으로 사용됩니다.
요청 URI에 대한 유일한 일치 항목이 하위 리소스 locaters인 경우 하위 리소스 locater에서 생성한 오브젝트의 리소스 메서드가 요청 URI와 일치하도록 합니다. 이 단계는 하위 리소스 메서드가 요청 URI와 일치할 때까지 반복됩니다.
요청을 처리할 리소스 메서드를 선택합니다.
HTTP 동사 주석이 요청의 HTTP 동사와 일치하는 리소스 메서드입니다. 또한 선택한 리소스 방법은 요청 엔터티 본문의 미디어 유형을 수락해야 하며 요청에 지정된 미디어 유형을 준수하는 응답을 생성할 수 있어야 합니다.
46.6.3. 여러 리소스 클래스에서 선택
선택 알고리즘의 처음 두 단계에서는 요청을 처리할 리소스를 결정합니다. 경우에 따라 리소스는 리소스 클래스에 의해 구현됩니다.In some cases the resource is implemented by a resource class. 다른 경우에는 동일한 URI 템플릿을 사용하는 하나 이상의 하위 리소스에 의해 구현됩니다. 요청 URI와 일치하는 리소스가 여러 개 있는 경우 리소스 클래스가 하위 리소스보다 우선합니다.
리소스 클래스와 하위 리소스 간의 정렬 후 두 개 이상의 리소스가 요청 URI와 일치하는 경우 다음 조건을 사용하여 단일 리소스를 선택합니다.
URI 템플릿에서 가장 리터럴 문자를 사용하는 리소스를 선호합니다.
리터럴 문자는 템플릿 변수의 일부가 아닌 문자입니다. 예를 들어 /widgets/{id}/{color} 에는 10 개의 리터럴 문자가 있으며 /widgets/1/{color} 는 11개의 리터럴 문자가 있습니다. 따라서 요청 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
주석으로 지정됩니다. 리소스 메서드에서 생성할 수 있는 응답 유형은 @
inspector 주석을 사용하여 지정합니다.
리소스를 선택할 때 요청을 처리할 수 있는 여러 메서드가 생성되면 다음 조건을 사용하여 요청을 처리할 리소스 메서드를 선택합니다.When selecting a resource produces multiple methods that can handle a request the following criteria is used to select the resource method that will handle the request:
- 하위 리소스보다 리소스 메서드를 선호합니다.
- 하위 리소스 locaters를 통한 하위 리소스 방법을 선호합니다.
@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 구현을 등록합니다.