복붙노트

[SPRING] JPA Transient Annotation 및 JSON

SPRING

JPA Transient Annotation 및 JSON

이것은 JPA Transient 주석에 대한 다음 질문에 대한 후속 조치입니다. 왜 JPA에는 @Transient 주석이 있습니까?

지속성을 원하지 않는 일시적인 변수가 있고 일시적인 주석으로 표시되어 있습니다. 그러나 나머지 컨트롤러에서 JSON을 생성하려는 경우 출력 된 JSON에서이 임시 변수를 사용할 수 없습니다.

POJO PublicationVO는 단순한 속성이없고, getter와 setter 및 일시적인 변수가있는 개인 속성 (지속되는) 만 있습니다.

@RequestMapping(value = { "{publicationId}"}, method = RequestMethod.GET, produces = "application/json")
@ResponseBody public PublicationVO getPublicationDetailsJSON(@PathVariable(value = "publicationId") Integer publicationId) {
    LOG.info("Entered getPublicationDetailsJSON - publicationId: " + publicationId);

    //Call method to get the publicationVO based on publicationId
    PublicationVO publicationVO = publicationServices.getPublicationByIdForRestCalls(publicationId);       
    LOG.info("publicationVO:{}", publicationVO);

    LOG.info("Exiting getPublicationDetailsJSON");
    return publicationVO;
}

PublicationVO는 다음과 같습니다

    package com.trinity.domain.dao;

import java.util.Calendar;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import com.fasterxml.jackson.annotation.JsonInclude;

@Entity
@Table(name = "publication")
public class PublicationVO {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private Integer id;    
    @Column(name = "publicationName", unique = false, nullable = false, length = 200)
    private String publicationName;
    @Column(name = "publicationSource", unique = false, nullable = false, length = 45)
    private String publicationSource;

    @Column(name = "dateAdded", unique = false, nullable = false)
    private Calendar dateAdded;

    @Transient
    private float percentageProcessed;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getPublicationName() {
        return publicationName;
    }

    public void setPublicationName(String publicationName) {
        this.publicationName = publicationName;
    }

    public String getPublicationSource() {
        return publicationSource;
    }

    public void setPublicationSource(String publicationSource) {
        this.publicationSource = publicationSource;
    }

    public Calendar getDateAdded() {
        return dateAdded;
    }

    public void setDateAdded(Calendar dateAdded) {
        this.dateAdded = dateAdded;
    }

    public float getPercentageProcessed() {
        return percentageProcessed;
    }

    public void setPercentageProcessed(float percentageProcessed) {
        this.percentageProcessed = percentageProcessed;
    }

    @Override
    public String toString() {
        return "PublicationVO [id=" + id + ", publicationName=" + publicationName + ", publicationSource=" + publicationSource + ", dateAdded=" + dateAdded
                + ", percentageProcessed=" + percentageProcessed + "]";
    }
}

내 로그에서 publicationVO에 대한 디버그 문을 볼 때 일시적인 변수가 출력에 포함되지만 클라이언트 코드에서 일시적인 변수는 json 응답에 포함되지 않습니다.

어떤 도움이라도 대단히 감사합니다.

고맙습니다, Damien

해결법

  1. ==============================

    1.코멘트에서 내가 말한 것과는 반대로, Jackson은 Jason Hibernate 모듈 덕분에 엔티티 클래스의 인스턴스를 직렬화하는 데 사용될 때 JPA 주석에 관심을 갖는 것으로 보입니다.

    코멘트에서 내가 말한 것과는 반대로, Jackson은 Jason Hibernate 모듈 덕분에 엔티티 클래스의 인스턴스를 직렬화하는 데 사용될 때 JPA 주석에 관심을 갖는 것으로 보입니다.

    이 모듈에는 문서가 참조하는 HibernateAnnotationIntrospector가있다.

    그리고 여기서 볼 수 있듯이 Jackson의 기본 동작은 찾을 수있는 @Transient 주석을 확인하는 것입니다.

    따라서 결국 세 가지 방법 중 하나로 문제를 해결할 수 있습니다.

    건배

  2. ==============================

    2.간단히 JsonSerialize 및 JsonDeserialize 주석을 추가했습니다.

    간단히 JsonSerialize 및 JsonDeserialize 주석을 추가했습니다.

    @Transient
    @JsonSerialize
    @JsonDeserialize
    private String myField;
    
  3. ==============================

    3.m4rtin이 제공 한 답을 더 추가하기 만하면됩니다.

    m4rtin이 제공 한 답을 더 추가하기 만하면됩니다.

    첫 번째 접근법을 살펴 보았습니다. @Transient 주석에 대한 검사를 사용하지 않도록 Jackson (HibernateAnnotationIntrospector의 setUseTransient 메소드 사용)을 구성하십시오.

    내 프로젝트에서 다음과 같은 스레드를 잭슨 직렬화 피하기 위해 가져온 게으른 개체를 피하기 위해 따라야했다 페치되지 않은 게으른 객체에서 Jackson 직렬화 피하기

    transient 어노테이션을 무시하지 않도록 프로젝트를 설정하려면, 다음과 같이 Hibernate4Module을 설정한다.

            Hibernate4Module hm = new Hibernate4Module();
        hm.disable(Feature.USE_TRANSIENT_ANNOTATION);
    

    이 m4rtin에 대한 귀하의 도움에 감사드립니다.

  4. ==============================

    4.@Transient와 @JsonProperty를 모두 사용하면 작동합니다!

    @Transient와 @JsonProperty를 모두 사용하면 작동합니다!

    @Transient
    @JsonProperty
    private String mapImageSrc;
    
  5. ==============================

    5.그것이 나를 위해 일한 것 :

    그것이 나를 위해 일한 것 :

    @Transient
    @JsonProperty
    

    GETTER (개인 필드 정의가 아님)

    @JsonAutoDetect(fieldVisibility = Visibility.ANY) 
    

    수업에 주석 달기

  6. ==============================

    6.com.fasterxml.jackson.annotation에서 @JsonIgnore를 사용하십시오. Date 변수에는 @JsonFormat도 있습니다. 나를 위해 일한다.

    com.fasterxml.jackson.annotation에서 @JsonIgnore를 사용하십시오. Date 변수에는 @JsonFormat도 있습니다. 나를 위해 일한다.

  7. ==============================

    7.@Transient를 추가 한 후 @JsonView를 시도하십시오.

    @Transient를 추가 한 후 @JsonView를 시도하십시오.

  8. ==============================

    8.다른 해결책이 없기 때문에 나에게 트릭을 어떻게했는지 내 솔루션을 게시하겠습니다.

    다른 해결책이 없기 때문에 나에게 트릭을 어떻게했는지 내 솔루션을 게시하겠습니다.

    @Transient
    @JsonSerialize
    private String mapImageSrc;
    

    이것은 @JsonSerialize 주석이 해당 사용 사례를 위해 만들어진 것처럼 나에게 가장 좋은 해결책 인 것 같다.

  9. ==============================

    9.나는 똑같은 문제가 있었다. 아래 솔루션은 나를 위해 일했습니다 :

    나는 똑같은 문제가 있었다. 아래 솔루션은 나를 위해 일했습니다 :

    @Bean
    public Module hibernate5Module() {
        Hibernate5Module hnetModule = new Hibernate5Module();
        hnetModule.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
        return hnetModule;
    }
    

    m4rtin에게 감사드립니다.

  10. from https://stackoverflow.com/questions/25713884/jpa-transient-annotation-and-json by cc-by-sa and MIT license