47.3. 매개변수 변환기

47.3.1. 개요

매개 변수 변환기를 사용하면 모든 유형의 필드, 빈 속성 또는 리소스 메서드 인수에 매개변수( 문자열 유형)를 삽입할 수 있습니다. 적절한 매개 변수 변환기를 구현하고 바인딩하여 매개 변수 String 값을 대상 유형으로 변환할 수 있도록 JAX-RS 런타임을 확장할 수 있습니다.

47.3.2. 자동 변환

매개변수는 String 의 인스턴스로 수신되므로 항상 String 유형의 필드, 빈 속성 및 메서드 매개변수에 직접 삽입할 수 있습니다. 또한 JAX-RS 런타임에는 매개 변수 문자열을 다음 유형으로 자동 변환하는 기능이 있습니다.

  1. 기본 유형.
  2. 단일 String 인수를 수락하는 생성자가 있는 형식입니다.Types that have a constructor that accepts a single String argument.
  3. 형식의 인스턴스를 반환하는 단일 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.
  4. 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)
{
  ...
}