JPA 과도 주석 및 JSON
JPA 과도 주석의 다음 질문에 대한 후속 질문입니다. JPA에 @Transient 주석이 있는 이유는 무엇입니까?
지속하지 않으려는 과도 변수가 있으며 이 변수는 과도 주석으로 표시됩니다.단, 나머지 컨트롤러에서 JSON을 생성하는 경우 이 과도 변수는 출력된 JSON에서 사용할 수 없습니다.
POJO 출판물VO는 고급 애트리뷰트 없이 getter와 setter 및 1개의 과도변수를 가진 몇 가지 프라이빗 애트리뷰트(지속되는 것)만 있는 스트레이트입니다.
@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;
}
출판물VO는 다음과 같습니다.
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 + "]";
}
}
공개용 디버깅스테이트먼트가 표시되었을 때로그에서는 과도 변수가 출력에 포함되지만 클라이언트 코드에서는 과도 변수가 json 응답에 포함되지 않습니다.
어떤 도움이라도 대단히 감사합니다.
고마워, 데미안
단순히 JsonSerialize 및 JsonDeserialize 주석을 추가했습니다.
@Transient
@JsonSerialize
@JsonDeserialize
private String myField;
제가 코멘트에서 말씀드린 것과 달리 잭슨은 잭슨의 휴지 상태 모듈 덕분에 엔티티 클래스의 인스턴스를 시리얼화할 때 JPA 주석을 신경 쓰는 것 같습니다.
이 모듈에는 Hibernate Annotation이 있습니다.설명서에서 언급하고 있는 인스펙터
단순 주석잭슨 및/또는 JAXB 주석과 함께 무시할 수 없는 필드를 나타내기 위해 Transient 사용을 지원하는 Introspector.
그리고 여기 보시는 것처럼 잭슨의 기본 동작은 이 모든 것을 체크하는 것입니다.@Transient
주석을 찾을 수 있습니다.
따라서 최종적으로는 다음 3가지 방법 중 하나로 문제를 해결할 수 있습니다.
- 잭슨 설정(Hibernate Annotation 사용)Introspector의 setUseTransient 메서드)를 사용하여 다음 항목에 대한 체크를 비활성화합니다.
@Transient
주석(구현에 대한 자세한 내용은 이 답변을 참조하십시오). - 다음 오브젝트 사용
PublicationVO
당신의 결과로서getPublicationDetailsJSON
방법.값 개체에서 반환되는 개체로 속성을 복사해야 합니다. - 를 삭제합니다.
@Transient
주석을 달아 속성을 유지하십시오(단, 처음부터 이 속성을 JPA-transient하게 만든 타당한 이유가 있을 수 있으므로 옵션이 아닐 수도 있습니다).
건배.
m4rtin이 제공한 답변에 추가하기 위해
첫 번째 접근방식 - 잭슨 구성 (Hibernate Annotation 사용)Introspector의 setUseTransient 메서드)를 사용하여 @Transient 주석 체크를 비활성화합니다.
프로젝트에서 가져오기되지 않은 지연 객체에 대한 잭슨 직렬화를 피하기 위해 다음 스레드를 따라야 했습니다. 가져오기되지 않은 지연 객체에 대한 잭슨 직렬화를 피하십시오.
과도 주석을 무시하지 않도록 프로젝트를 구성하기 위해 다음과 같이 Hibernate4 모듈을 설정합니다.
Hibernate4Module hm = new Hibernate4Module();
hm.disable(Feature.USE_TRANSIENT_ANNOTATION);
이 m4rtin에 대해 도와주셔서 감사합니다.
@Transient와 @JsonProperty를 함께 사용하면 동작합니다!
@Transient
@JsonProperty
private String mapImageSrc;
나에게 효과가 있는 것:
@Transient
@JsonProperty
GETTER 내(프라이빗 필드 정의에 없음)
그리고.
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
클래스에 주석 붙이기
여기에서는 다른 솔루션을 사용할 수 없었기 때문에, 이 솔루션이 어떻게 도움이 되었는지 투고하겠습니다.
@Transient
@JsonSerialize
private String mapImageSrc;
이 게게 the this the the the the the the the the the the 。@JsonSerialize
해당 사용 사례에 대한 주석이 작성되었습니다.
저도 같은 문제가 있었어요.이하의 솔루션이 유효했습니다.
@Bean
public Module hibernate5Module() {
Hibernate5Module hnetModule = new Hibernate5Module();
hnetModule.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
return hnetModule;
}
m4rtin 덕분이야
@Transient를 추가한 후 @JsonView를 사용해 보십시오.
내 경우 다음과 같이만 작동합니다.
@Transient
@JsonGetter(value = "transientProperty")
public String getSomething() {
return something;
}
이게 누군가에게 도움이 됐으면 좋겠어요.안부 전해요.
com.fasterxml.jackson.annotation에는 @JsonIgnore를 사용합니다.또, @JsonFormat for Date 변수도 있습니다.나에겐 통한다
언급URL : https://stackoverflow.com/questions/25713884/jpa-transient-annotation-and-json
'programing' 카테고리의 다른 글
메시지를 로드하기 위한 ng-clock의 반대 (0) | 2023.02.26 |
---|---|
CRUDRespository에서 업데이트 또는 저장 업데이트, 사용 가능한 옵션이 있습니까? (0) | 2023.02.26 |
워드프레스, pre_get_posts에 여러 meta_key가 있습니다. (0) | 2023.02.26 |
React에서 증분 연산자를 사용하는 방법 (0) | 2023.02.26 |
React-Router - Uncaught TypeError: 정의되지 않은 속성 'getCurrentLocation'을 읽을 수 없습니다. (0) | 2023.02.26 |