47.3. 매개변수 변환기
47.3.1. 개요
매개 변수 변환기를 사용하면 모든 유형의 필드, 빈 속성 또는 리소스 메서드 인수에 매개변수( 문자열
유형)를 삽입할 수 있습니다. 적절한 매개 변수 변환기를 구현하고 바인딩하여 매개 변수 String 값을 대상 유형으로 변환할 수 있도록 JAX-RS 런타임을 확장할 수 있습니다.
47.3.2. 자동 변환
매개변수는 String
의 인스턴스로 수신되므로 항상 String
유형의 필드, 빈 속성 및 메서드 매개변수에 직접 삽입할 수 있습니다. 또한 JAX-RS 런타임에는 매개 변수 문자열을 다음 유형으로 자동 변환하는 기능이 있습니다.
- 기본 유형.
-
단일 String 인수를 수락하는 생성자가 있는 형식입니다.Types that have a constructor that accepts a single
String
argument. -
형식의 인스턴스를 반환하는 단일 String 인수가 있는
valueOf
또는fromString
이라는 정적 메서드가 있는 Type입니다.Types that have a static method named valueOf or fromString with a single String argument that returns an instance of the type. -
List<T
> ,Set<T
> , 또는SortedSet
<T
>, T 가 2 또는 3에 설명된 유형 중 하나인 경우.
47.3.3. 매개 변수 변환기
자동 변환에서 다루지 않는 형식에 매개 변수를 삽입하려면 해당 형식에 대한 사용자 지정 매개 변수 변환기를 정의할 수 있습니다.In order to inject a parameter into a type not covered by automatic conversion, you can define a custom parameter converter for the type. 매개 변수 변환기는 String에서 사용자 지정 형식으로 변환 정의 및 사용자 지정 형식에서 String으로의 변환을 정의할 수 있는 JAX-RS 확장입니다.A parameter converter is a JAX-RS extension that enables you to define conversion from String
to a custom type, and also in the reverse direction, from the custom type to a String
.
47.3.4. 팩토리 패턴
JAX-RS 매개 변수 변환기 메커니즘은 팩토리 패턴을 사용합니다. 따라서 매개 변수 변환기를 직접 등록하는 대신 요청 시 매개 변수 변환기(type, javax.ws.rs.ext.ParamConverterProvider
)를 만드는 매개 변수 변환기(type, javax.ws.rs.ext.ParamConverter
)를 생성해야 합니다.
47.3.5. ParamConverter 인터페이스
javax.ws.rs.ext.ParamConverter
인터페이스는 다음과 같이 정의됩니다.
// Java package javax.ws.rs.ext; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.ws.rs.DefaultValue; public interface ParamConverter<T> { @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public static @interface Lazy {} public T fromString(String value); public String toString(T value); }
자체 ParamConverter
클래스를 구현하려면 fromString
메서드를 재정의하여 매개 변수 문자열을 대상 유형으로 변환하고 대상 유형을 문자열로 다시 변환 해야
합니다.
47.3.6. ParamConverterProvider 인터페이스
javax.ws.rs.ext.ParamConverterProvider
인터페이스는 다음과 같이 정의됩니다.
// Java package javax.ws.rs.ext; import java.lang.annotation.Annotation; import java.lang.reflect.Type; public interface ParamConverterProvider { public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation annotations[]); }
자체 ParamConverterProvider
클래스를 구현하려면 이 인터페이스를 구현해야 합니다. 이 인터페이스는 ParamConverter
인스턴스를 생성하는 팩토리 메서드인 getConverter
메서드를 재정의해야 합니다.
47.3.7. 매개 변수 변환기 공급자 바인딩
매개 변수 변환기 공급자를 JAX-RS 런타임(애플리케이션에서 사용할 수 있도록 하는)에 바인딩 하려면 다음과 같이 구현 클래스에 @Provider
주석을 추가해야 합니다.
// Java ... import javax.ws.rs.ext.ParamConverterProvider; import javax.ws.rs.ext.Provider; @Provider public class TargetTypeProvider implements ParamConverterProvider { ... }
이 주석은 배포 단계에서 매개변수 변환기 공급자가 자동으로 등록되도록 합니다.
47.3.8. 예제
다음 예제에서는 매개 변수 문자열을 TargetType
형식으로 변환
하거나 변환할 수 있는 기능이 있는 ParamConverter
및 ParamConverter를 구현하는 방법을 보여줍니다.
// Java import java.lang.annotation.Annotation; import java.lang.reflect.Type; import javax.ws.rs.ext.ParamConverter; import javax.ws.rs.ext.ParamConverterProvider; import javax.ws.rs.ext.Provider; @Provider public class TargetTypeProvider implements ParamConverterProvider { @Override public <T> ParamConverter<T> getConverter( Class<T> rawType, Type genericType, Annotation[] annotations ) { if (rawType.getName().equals(TargetType.class.getName())) { return new ParamConverter<T>() { @Override public T fromString(String value) { // Perform conversion of value // ... TargetType convertedValue = // ... ; return convertedValue; } @Override public String toString(T value) { if (value == null) { return null; } // Assuming that TargetType.toString is defined return value.toString(); } }; } return null; } }
47.3.9. 매개 변수 변환기 사용
이제 TargetType에 대한 매개변수 변환기를 정의했으므로 다음과 같이
필드 및 인수에 직접 매개변수를 삽입할 수 있습니다.
TargetType
// Java import javax.ws.rs.FormParam; import javax.ws.rs.POST; ... @POST public Response updatePost(@FormParam("target") TargetType target) { ... }
47.3.10. 기본값의 지연 변환
매개변수의 기본값( @DefaultValue
주석을 사용하여) 기본값을 지정하는 경우 기본값을 바로 대상 유형(기본 동작)으로 변환하거나 필요한 경우에만 기본값을 변환해야 하는지(lazy 변환)할지 여부를 선택할 수 있습니다. 지연 변환을 선택하려면 대상 유형에 @ParamConverter.Lazy
주석을 추가합니다. 예를 들면 다음과 같습니다.
// Java import javax.ws.rs.FormParam; import javax.ws.rs.POST; import javax.ws.rs.DefaultValue; import javax.ws.rs.ext.ParamConverter.Lazy; ... @POST public Response updatePost( @FormParam("target") @DefaultValue("default val") @ParamConverter.Lazy TargetType target) { ... }