2017-04-03 4 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 객체 인 경우 else 속성과 함께 객체.

주소 필드에 null을 설정하는 것은 옵션이 아닙니다. 필자는 JacksonView와 JacksonFilter를 사용하여이 작업을 시도했지만 아직이 시나리오에 맞지 않았습니다.

이 문제를 해결하기위한 아이디어 나 샘플 코드는 무엇입니까?

당신은 속성을 무시하도록 적절한 주석을 MyDto의 서브 클래스를 생성 할 수 있습니다

답변

1

:

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해야 할 것이다.