[RESTFul] ResponseEntity 제너릭 타입 사용 타입처리 방법???

2018. 1. 25. 16:30JAVA/Webservice(REST)

제목을 써 놓고도 제목이 어렵네용..ㅡㅡ;;


여튼 RESTFul 서비스를 하여 JSON 으로 결과 값을 받을 경우


public class ResponseWrapper {

...

private Object data;

...

}


위와 같은 방식으로 Data를 받을 경우 저 Data의 값이 어떠한 타입인지 모르기 때문에 

결과 적으로는 


{

success : true,

data : { userId=kamsi76, password=1234 }

}


이렇게 data가 JSON 형식이 아닌 형식으로 받게 되어 맵핑이 정상적으로 되지 않습니다.


그래서 다음과 같이


public class ResponseWrapper<T> {

...

private T data;

...

}


이렇게 처리 하면 되겠구나 하고 다시 수정을 했으나....


다음과 같은 문제가 발생을 합니다.


RestTemplate restTemplate = getRestTemplate();

ResponseEntity<ResponseWrapper<UserVo>> response = restTemplate.exchange(

url,

method,

null,

ResponseWrapper.class

);


이런식으로 하면 오류가 발생한다는....


그래서 구글링 한 결과


RestTemplate restTemplate = getRestTemplate();

ResponseEntity<ResponseWrapper<UserVo>> response = restTemplate.exchange(

url,

method,

null,

new ParameterizedTypeReference<ResponseWrapper<UserVo>>() {});

);


이렇게 하면 정상 동작을 합니다...


하지만 여기서 더 나아가...


저걸 공통으로 사용하기 위해 Util을 만들어서 사용한다고 할 경우


public <V, T> ResponseEntity<ResponseWrapper<T>> send(String url, V sendObj, Class<T> responseType, HttpMethod method) {

RestTemplate restTemplate = getRestTemplate();

ResponseEntity<ResponseWrapper<T>> response = restTemplate.exchange(

url,

method,

getEntity(sendObj),

new ParameterizedTypeReference<ResponseWrapper<T>>() {});


return response;

}


이렇게 처리하면 될 줄 알았습니다....


그런데... 정상 동작하지 않고 


{

success : true,

data : { userId=kamsi76, password=1234 }

}


결과가 이렇게 나와 버리는 현상이 나오게 되었습니다..


다시 구글링....


그래서 최종 소스는 다음과 같습니다..


public class RESTUtil {


...


public <V, T> ResponseEntity<ResponseWrapper<T>> send(String url, V sendObj, Class<T> responseType, HttpMethod method) {

RestTemplate restTemplate = getRestTemplate();

ResponseEntity<ResponseWrapper<T>> response = restTemplate.exchange(

url,

method,

getEntity(sendObj),

new ParameterizedTypeReference<ResponseWrapper<T>>() {

public Type getType() {

return new CustomParameterizedTypeImpl((ParameterizedType)super.getType(), new Type[] { responseType});

}

}

);


return response;

}


//내부 클래스로 두었슴...

class CustomParameterizedTypeImpl implements ParameterizedType {


    private ParameterizedType delegate;


    private Type[] actualTypeArguments;


    CustomParameterizedTypeImpl(ParameterizedType delegate, Type[] actualTypeArguments) {

            this.delegate = delegate;

            this.actualTypeArguments = actualTypeArguments;

        }


@Override

public Type[] getActualTypeArguments() {

return actualTypeArguments;

}


@Override

public Type getRawType() {

return delegate.getRawType();

}


@Override

public Type getOwnerType() {

return delegate.getOwnerType();

}


}

}


이와 같이 사용하면 정상 동작합니다.


이상입니다.



'JAVA > Webservice(REST)' 카테고리의 다른 글

07. POST 방식 호출  (0) 2015.08.06
06. 서비스 호출  (0) 2015.08.06
05. beans.xml과 web.xml  (0) 2015.08.06
04. 프로젝트의 시작  (0) 2015.08.06
03. Eclipse 환경설정  (0) 2015.08.06