47.3. 매개변수입니다.
47.3.1. 개요
매개 변수 변환기를 사용하면 모든 유형의 필드,ans 속성 또는 리소스 메서드 인수에 매개 변수( 문자열
유형)를 삽입할 수 있습니다. 적절한 매개 변수 변환기를 구현하고 바인딩하면 parameter String 값을 대상 유형으로 변환할 수 있도록 Cryostat-RS 런타임을 확장할 수 있습니다.
47.3.2. 자동 변환
매개 변수는
의 인스턴스로 수신되므로 항상 문자열 유형의 필드, 빈 속성 및 메서드 매개 변수에 직접 삽입할 수 있습니다. 또한 Cryostat-RS 런타임에는 매개변수 문자열을 다음 유형으로 자동으로 변환하는 기능이 있습니다.
String
- 기본 유형.
-
단일
문자열 인수를 허용하는 생성자가 있는 형식입니다.Types that have a constructor that accepts a single string
argument. -
형식의 인스턴스를 반환하는 단일 String 인수가 있는 static 메서드
valueOf
또는fromString
이 있는 형식입니다.Types that have a static method named valueOf or fromString with a single string argument that returns an instance of the type. -
T가 2 또는 3에 설명된 유형 중 하나인 경우 list
<T
>,Set<
<T> .T
> 또는 SortedSet
47.3.3. 매개변수 변환기
자동 변환이 적용되지 않는 형식에 매개 변수를 삽입하려면 유형에 대한 사용자 지정 매개 변수 변환기를 정의할 수 있습니다. 매개 변수 변환기는 사용자 지정 형식에서 문자열에서 문자열으로의 변환을 정의하고 사용자 지정 유형에서 문자열으로의 역방향 방향을 정의할 수 있는 확장입니다.A parameter converter is a Cryostat-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. 팩토리 패턴
Cryostat-RS 매개변수 변환기 메커니즘은 팩토리 패턴을 사용합니다. 따라서 매개 변수 변환기를 직접 등록하는 대신 필요에 따라 매개 변수 변환기(유형, 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
메서드를 재정의하고 매개 변수 문자열을 대상 유형으로 변환하려면 toString
메서드(대상 유형을 문자열로 다시 변환)를 수행해야 합니다.
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. 매개변수 변환기 공급자 바인딩
매개변수 변환기 공급자를 애플리케이션에서 사용할 수 있도록 하려면 다음과 같이 @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
Provider
// 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) { ... }