JAX-RS의 공급자는 무엇을 의미합니까? 요청을 처리하는

누구든지 JAX-RS 공급자가 무엇이며 ‘@Provider’주석이 무엇을하는지 설명해 주시겠습니까? 문서를 읽었지만 얻을 수 없습니다.
들어오는 요청을 처리하는 리소스 클래스가있는 경우 공급자는 무엇을합니까? 영구 리소스 클래스 (요청 당이 아닌 클래스)를 생성 할 때 단일 리소스 클래스와 어떻게 다릅니 까? 아니면 그 클래스도 제공자입니까?



답변

공급자는 JAX-RS 런타임을 확장하고 사용자 정의하는 단순한 방법입니다. 일련의 (프로그램 정의) 목표를 달성하기 위해 런타임의 동작을 (잠재적으로) 변경하는 플러그인으로 생각할 수 있습니다.

제공자는 자원 클래스와 동일 하지 않으며 개념적으로 자원 클래스와 JAX-RS 구현 사이의 레벨에 존재합니다. 도움이된다면 장치 드라이버와 같은 관점에서 생각할 수 있습니다 (사용자와 커널 공간 사이에 존재). 이것은 광범위한 일반화입니다.

현재 JAX-RS 스펙에 정의 된 세 가지 제공자 클래스가 있습니다. 이들 간의 공통점은 모든 공급자가 @Provider 주석으로 식별되어야하며 생성자 선언에 대한 특정 규칙을 따라야한다는 것입니다. 그 외에도 다른 공급자 유형에는 추가 주석이있을 수 있으며 다른 인터페이스를 구현합니다.


엔티티 제공자

이러한 공급자는 데이터 표현 (예 : XML, JSON, CSV)을 해당 Java 개체에 매핑하는 것을 제어합니다.

컨텍스트 제공자

이러한 공급자는 리소스가 @Context 주석을 통해 액세스 할 수있는 컨텍스트를 제어합니다.

예외 제공자

이러한 공급자는 JAX-RS 응답 인스턴스에 대한 Java 예외 매핑을 제어합니다.


런타임에는 기본 수준의 기능 (예 : XML과의 매핑, 가장 일반적인 예외 번역 등)을 구현하는 미리 정의 된 여러 공급자가 함께 제공됩니다. 필요에 따라 고유 한 공급자를 만들 수도 있습니다.

JAX-RS 스펙은 서로 다른 공급 업체의 유형과 그들이 (제 4 장 참조) 할에 독서에 대한 좋은 참조입니다.


답변

@provider의 주석이 관심을 아무것도에 사용되는 런타임 JAX-RS 와 같은, MessageBodyReaderMessageBodyWriter . HTTP 요청의 경우 MessageBodyReader는 HTTP 요청 엔터티 본문을 메서드 매개 변수에 매핑하는 데 사용됩니다. 응답 측에서는 MessageBodyWriter를 사용하여 반환 값이 HTTP 응답 엔터티 본문에 매핑됩니다. 애플리케이션이 HTTP 헤더 또는 다른 상태 코드와 같은 추가 메타 데이터를 제공해야하는 경우 메서드는 엔터티를 래핑하고 Response를 사용하여 빌드 할 수있는 Response를 반환 할 수 있습니다. ResponseBuilder .

@Provider 주석은 원시 XML 수준에서 수신 및 발신 메시지를 검사 할 수있는 기능을 제공하며 이러한 방식으로 Provider는 클라이언트의 Dispatch에 대응합니다.


답변

필터링 요청 / 응답, 예외 처리와 같은 특정 활동을 수행하기 위해 JAX-RS에는 자체 기본 구현 로직이 있습니다. 그러나 사용자가 자신의 구현을 제공 할 수도 있습니다.

자체 구현을 제공하려면 @Provider 주석으로 적절한 클래스를 지정하여 구현해야합니다.

JAX-RS는 @Provider 어노테이션을 검색하여 이러한 사용자 정의 구현의 존재를 찾기 위해 스캔 라운드를 수행합니다.

예를 들면 :

...
@Provider
public class AppExceptionMapper implements ExceptionMapper<Throwable> {
...

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...


답변