제목을 써 놓고도 제목이 어렵네용..ㅡㅡ;;
여튼 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 |