2012-12-10 5 views
1

내 GSON 문제는 내 반환 형식이 매개 변수화 된 개체가 아니라는 사실에 관한 것임을 알았습니다. 이제 Gson.fromJson 메서드를 매개 변수 형식과 함께 사용하여 반환 형식을 지정해야 GSON이이를 처리합니다."클래스"형식의 매개 변수화 된 형식을 만듭니다.

public class RestResponse<T> { 
    private String  errorMessage; 
    private int   errorReason; 
    private T   result; 

    /* (non-Javadoc) 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 
    return "RestResponse [errorMessage=" + errorMessage + ", result=" + result + "]"; 
    } 

    /** 
    * Does this response contain an error? 
    * @return true if in error 
    */ 
    public boolean isInError(){ 
    return getErrorMessage()!=null; 
    } 

    /** 
    * @return the errorMessage 
    */ 
    public String getErrorMessage() { 
    return errorMessage; 
    } 

    /** 
    * @param errorMessage the errorMessage to set 
    */ 
    public void setErrorMessage(String errorMessage) { 
    this.errorMessage = errorMessage; 
    } 

    /** 
    * The error reason code 
    * @return the errorReason 
    */ 
    public int getErrorReason() { 
    return errorReason; 
    } 

    /** 
    * The error reason code 
    * @param errorReason the errorReason to set 
    */ 
    public void setErrorReason(int errorReason) { 
    this.errorReason = errorReason; 
    } 

    /** 
    * The result of the method call 
    * @return the result or null if nothing was returned 
    */ 
    public final T getResult() { 
    return result; 
    } 

    /** 
    * The result of the method call 
    * @param result the result to set or null if nothing was returned 
    */ 
    public final void setResult(T result) { 
    this.result = result; 
    } 
} 

가 지금은 다른 쪽의 결과 유형을 만들려면 :

나는 그런 제네릭 클래스라는 RestResponse을 만들었습니다. 이러한 것들을 디코딩하고 예외를 던지거나 결과를 반환하는 데 사용하는 제네릭 메서드가 있습니다.

그래서 내 방법은 다음과 같이이다 :

clazz에이 RestResponse에 지정됩니다 유형이다
public Object submitUrl(String url, Class<?> clazz) throws AjApiException { 

.

그때 GSON에 전달하기 전에 RestResponse을 만들로 이동합니다

Type typeOfT = new TypeToken<RestResponse<clazz>>(){}.getType(); //1-->What goes here? 
RestResponse<clazz> restResponse; //2-->and here? 

그리고 오류를. 누군가가 clazz 대신이 장소에 무엇이 들어 있는지 말해 줄 수 있습니까?

답변

0

나는 대신 클래스 대신에 유형을 전달했다. 이것은 문제를 해결했습니다.

나는 당신이 좋아하는 일을하여 유형을 만들 수 있다고 생각 :

Type typeOfT = new TypeToken<RestResponse<T>>(){}.getType(); 
+0

구현 방법에 대한 자세한 정보를 제공해 주시겠습니까? 감사! –

+0

@BenoitDuffez 도움이 될 것이라고 생각되는 코드를 추가했습니다. 잠시 지났으므로 문법이 확실하지 않습니다. 유용하다면 upvote하십시오. – Thom

+0

감사합니다. 그것은 내가 원하는 해결책이 아니지만 여전히 누군가에게 유용 할 수 있습니다.또한 ''은 유형 삭제 때문에 유용하지 않습니다. Gson에게 제네릭을 기술하는 방법을 발견 한 유일한 방법은'ParameterizedType'을 이용하는 것입니다. http://stackoverflow.com/a/14139700/334493을 참조하십시오. –

1

응답을 래핑하려는 클래스를 전달하는 대신 메서드 수준 제네릭 매개 변수로 지정하십시오.

public <T> T submitUrl(String url) throws AjApiException { 
    Type typeOfT = new TypeToken<RestResponse<T>>(){}.getType(); 
} 
+0

나는이 각 방법에 대한 새로운 인스턴스를 필요로 등 쿠키를 유지 하나 개의 인스턴스를 갖고 싶어하기 때문에이 작업을 수행하지 마십시오 그것을 사용합니다. – Thom

+0

쿠키를 유지 관리하면 JSON을 deserialize하는 것과 관련이 있습니까? 이 방법은 추가 제한을 두지 않고 대상 클래스를 지정하면서 발생한 문제를 해결합니다. 당신은 당신이 정확하게하려고하는 것을 명확히하고 싶을 수도 있습니다. – Perception

+0

아니요, 'typeOfT'는'RestResponse '유형을 나타냅니다. 예, 문자 그대로 "T"입니다. 그의 수업이 무엇이든간에. – newacct

-1

가장 쉬운 방법은 RestResponse<Whatever>에 대응하는 Type 전달하는 대신 Class 개체에 전달하는, 상기 방법의 호출자에 대한 것이다; 그들은 아마도 TypeToken 것을 사용하여 이것을 할 것입니다.

그렇지 않으면 Type (구체적으로 ParameterizedType)을 직접 구성 할 수 있습니다. ParameterizedType을 구현하는 클래스를 만들거나 일부 프로젝트에서 사용되는 ParameterizedTypeImpl 개인 클래스를 복사해야합니다.

관련 문제