2017-04-03 11 views
1

私は以下のようなクラスを持っています。パラメータに基づいてRESTでDTOからプロパティを除外する方法

public class MyDto { 

    private int id; 
    private String name; 
    private String address; 
    // getters and setters ..... 
    } 

以下のようなMS4Jサービスでは、このオブジェクトのJSONを返します。

import javax.ws.rs.*; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.Response; 
import org.example.service.dto.MyDto; 
import org.wso2.msf4j.Request; 

    @Path("/hello/1.[\\d]/version") 
    public class HelloService { 

     @GET 
     @Path("/{version}") 
     @Produces({"application/json"}) 
     public Response hello(@PathParam("version") int version, @Context Request request) { 
      MyDto dtoObject = new MyDto(1, "TestObjName", "TestObjAddress"); 
      if (version < 1) { 
       //return object without address 
      } else { 
       //return object with address 
      } 
     } 
    } 

実行時に、バージョンに基づいてJavaクラスからプロパティを除外する必要があります。すなわち、バージョン> 1のオブジェクトで、アドレスなしのオブジェクトであれば、アドレスプロパティを持つオブジェクトです。

アドレスフィールドにnullを設定することはできません。私はJacksonViewとJacksonFilterでこれをやろうとしましたが、このシナリオにはまだ適合しませんでした。

これを修正するためのアイデアやサンプルコードはありますか?

答えて

1

あなたは、プロパティを無視し、適切な注釈をMyDtoのサブクラスを作成することができます

public class OldVersionDto extends MyDto 
{ 
    @JsonIgnore 
    protected String address; 

    public OldVersionDto(int id, String name, String address) { 
     super(id, name, address); 
    } 
} 

それが唯一のアドホックな目的を果たす場合はそれも(サービスの内部クラスすることができだけにしてください静的にする)。今、あなたはもちろんの

 MyDto dtoObject; 
     if (version < 1) { 
      dtoObject = new MyDto(1, "TestObjName", "TestObjAddress"); 
     } else { 
      dtoObject = new OldVersionDto(1, "TestObjName", "TestObjAddress"); 
     } 

引数に応じて、ローカル変数をインスタンス化し、addressプロパティが成功するために、このための基本クラス順にprotectedする必要があります。

関連する問題