2014-04-05 2 views
3

JSON 마샬링 및 언 마샬링을 위해 Jackson (jaxb)을 사용하고 있습니다.Jackson jaxb runtime은 지정된 필드에 대해 @XmlTransient annotation을 사용하지 않습니다.

사람 레코드가 나열되어있을 때 (보안 및 속도 문제) 주소 필드를 게으른 것으로 매핑하지 않으려면 여기에 예를 들어 주소 필드 XmlTransient를 주석으로 추가했습니다. 그러나 단일 사람 레코드가 반환되면 그 주소 필드가 매핑되기를 원하지만 주소를 열심히 가져 오는 것조차 jaxb는 여전히 매핑하지 않습니다. 주소 필드에 @XmlTransient가 주석으로 달릴 때이 동작을 변경하고 런타임에이 필드를 매핑 할 수있는 방법이 있습니까? Pinchy

public class Person implements Serializable { 

    @Column(nullable = false, length = 50) 
    private String username; 

    @OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}) 
    private Address address; 

    public String getUsername() { 
     return this.username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    @XmlTransient 
    public Address getAddress() { 
     return this.address; 
    } 

    public void setAddress(Address address) { 
     this.address = address; 
    } 
} 

답변

3

DTOs을 사용하는 것이 좋습니다. 특히 애플리케이션의 성장 가능성 (또는 이미 커진 경우)이 복잡한 경우와 같이 여러 상황이있을 수 있습니다. 즉, 컨텍스트에서 엔티티의 일부만 표시하고 다른 컨텍스트에서는 일부만 표시하려는 경우가 있습니다. DTO는 실제로 데이터를 전송하는 데 사용되며 엔터티가 아닙니다.

1

는 @JsonIgnore를 사용하려고했다. 사용자가 레코드가 하나만있는 경우 표시 할 논리를 추가 할 수 있습니다. 중복 변수를 만들어야합니다.

@JsonIgnore 공공 주소 getAddress1() { 반환 this.address 같은

뭔가; }

public void setAddress1(Address address1) { 
    this.address = address1; 
} 
+0

답장을 보내 주셔서 감사합니다.하지만 제가하고 싶은 것은 아닙니다. 내가 주소와 암호 필드를 무시하고 싶은 사람 객체의 목록을 반환하고 단일 객체를 반환 할 때 어떤 필드도 무시하고 싶지 않습니다. 변수를 중복하면 내 문제가 해결되지 않으며 나쁜 디자인입니다. – Pinchy

1

@XmlTransient는 당신은 아마 사용되는 JaxbAnnotationIntrospector 인식 :

@Override 
public boolean hasIgnoreMarker(AnnotatedMember m) { 
    return m.getAnnotation(XmlTransient.class) != null; 
} 

그래서 가장 쉬운 방법은 아마 그것을 하위 클래스라는 및 메서드를 재정의. 일반적으로 'false'를 반환하거나 특정 인스턴스를 하나만 마스킹해야하는 경우 메서드 나 필드의 이름과 일치시켜야 원하는대로 차단할 수 있습니다.