2017-07-19 3 views
2

私はクライアントアプリケーションとサーバーアプリケーションを持っています。どちらもJavaを使用して春に書かれています。 RestTemplateを使用してクライアントからサーバーを呼び出しています。Spring RestTemplate - httpステータスコードに基づいて異なるオブジェクトタイプを読み込みますか?

サーバーは、操作結果に応じて異なる応答オブジェクトを返します。
簡体字コード:

public ResponseEntity<?> saveSomething (Object something) { 
    boolean saved = save(something); //save logic 
    if(saved) 
     return new ResponseEntity<OKObject>(okObject,HttpStatus.OK); 
    else 
     return new ResponseEntity<ErrorObject>(errorObject,HttpStatus.FAILED); 
} 

私は、ステータスコード、
ことで、クライアント上でこれらの回答を読むことができるようにしたいが、RestTemplateは1種類、例えばを読み取るためにのみ提供しています<Object_type>.class; であり、応答タイプがすでに返されている場合は、.getForEntity(...)操作が実行された後のステータスコードが です。
私はクライアント側で擬似コードで欲しい :

public void saveSomething(Object toSave) { 
    ResTemplate template = new RestTemplate(); 
    ResponseEntity<Object> response = template.getForEntity(url,Object.class); 
    if(response.getStatusCode() == HttpStatus.OK) { 
     OKObject ok = (OKObject) response.getBody(); 
     //some work with ok object 
    } 
    if(response.getStatusCode() == HttpStatus.FAILED) { 
     ErrorObject errorObject = (ErrorObject) response.getBody(); 
     //some work with errorObject 
    } 
} 

は、いくつかの非ハック、クリーンな方法でこれは可能ですか?応答のタイプをString.classと設定し、それ以降は解析するか、Object.classLinkedHashMapを返す)を読み込んで解析します。
ありがとうございます。

答えて

2

私は結果

public void saveSomething(Object toSave) { 
    ResTemplate template = new RestTemplate(); 
    ResponseEntity<CommonResponseObject> response = template.getForEntity(url,CommonResponseObject.class); 
    if(response.getStatusCode() == HttpStatus.OK) { 
     OKObject ok = response.getBody().getOkObject(); 
    } 
    if(response.getStatusCode() == HttpStatus.FAILED) { 
     ErrorObject errorObject = response.getBody().getErrorObject(); 
    } 
} 
をOKとエラーの両方が含まれ、共通の応答(そのうちの一つがnull)

publi class CommonResponseObject { 
    private OKObject okObject; 
    private ErrorObject errorObject; 
    public CommonResponseObject(OKObject okObject) { 
     this.okObject=okObject; 
    } 
    public CommonResponseObject(ErrorObject errorObject) { 
     this.errorObject=errorObject; 
    } 
} 

を導入し、

public ResponseEntity<CommonResponseObject > saveSomething (Object something) { 
    boolean saved = save(something); //save logic 
    if(saved) 
     return new ResponseEntity<>(new CommonResponseObject(okObject),HttpStatus.OK); 
    else 
     return new ResponseEntity<>(new CommonResponseObject(errorObject),HttpStatus.FAILED); 
} 

を、それを使用して処理することをお勧め

+0

それは本当に悪いです。なぜなら、より多くのresponseObjectを使用すると、より多くの冗長データを転送することができるからです。また、コード内には応答を得るために多くの応答クラスが1つにまとめられています。これは私が望んでいないハッピーな方法です。しかし、応答に感謝します。 – milkamar

+2

もう少し.. ok/errorの1つは常にnullです。ヌルをスキップするようにシリアライズを構成できます。余分な情報(jsonの場合)は、単にフィールド名okかエラーです。 – StanislavL

+1

また、文字列を送信し、ステータスをチェックして、文字列をOKまたはエラーオブジェクト – StanislavL

関連する問題