JPA瞬态注释和JSON [英] JPA Transient Annotation and JSON

查看:103
本文介绍了JPA瞬态注释和JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是关于JPA瞬态注释的以下问题的后续行动
为什么JPA有一个@Transient注释?

This is a follow up to the following question on the JPA Transient annotation Why does JPA have a @Transient annotation?

我有一个我不想持久的瞬态变量,它标有瞬态注解。
但是,当我想从我的其余控制器生成JSON时,输出的JSON中没有这个瞬态变量。

I have a transient variable that I do not want to persist and it is marked with the transient annotation. However, when I want to produce JSON from my rest controller, this transient variable is not available in the outputted JSON.

POJO PublicationVO是直截了当的没有花哨的属性,只有一些私有属性(持久化)有getter和setter以及1个瞬态变量。

The POJO PublicationVO is straight forward with no fancy attributes, just some private attributes (that are persisted) with getters and setters and 1 transient variable.

@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如下

The PublicationVO is as follows

    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响应中。

When I see the debug statement for publicationVO in my logs, the transient variable is included in the output but in my client code, the transient variable is not included in the json response.

非常感谢任何帮助。

谢谢你,
Damien

Thank you, Damien

推荐答案

与我的相反在评论中告诉你,由于 Jackson的Hibernate模块

Contrary to what I was telling you in comments, it seems that Jackson does care about JPA annotations when used to serialize instances of entity classes thanks to the Jackson's Hibernate module.

在该模块中,有一个 HibernateAnnotationIntrospector 文档引用为

Within that module, there is an HibernateAnnotationIntrospector that the documentation refers to as a

简单的AnnotationIntrospector增加了对使用Transient到
的支持,表示可忽略的字段(以及Jackson和/或JAXB
注释)。

simple AnnotationIntrospector that adds support for using Transient to denote ignorable fields (alongside with Jackson and/or JAXB annotations).

你可以看到这里,杰克逊的默认行为是检查任何 @Transient 它可以找到的注释。

And as you can see here, the default behavior of Jackson is to check for any @Transient annotation it can find.

所以最后,你可以用以下三种方式解决你的问题:

So in the end, your problem can be solved in either of those 3 ways :


  1. 配置Jackson(使用HibernateAnnotationIntrospector的 setUseTransient 方法)禁用对 @Transient 注释的检查ns(有关实施细节,请参阅此答案)。

  2. 使用除<之外的其他对象code> PublicationVO 作为 getPublicationDetailsJSON 方法的返回结果。您必须将值对象中的属性复制到某个时刻返回的对象。

  3. 删除 @Transient 注释和坚持财产(但我会理解,如果你不是一个选择,因为你可能有充分的理由让这个属性首先成为JPA瞬态)。

  1. Configure Jackson (using HibernateAnnotationIntrospector's setUseTransient method) to disable the check for @Transient annotations (see this answer for implementation details).
  2. Use another object than PublicationVO as the returned result of your getPublicationDetailsJSON method. You'll have to copy properties from your value object to the object being returned at some point.
  3. Remove the @Transient annotation and persist the property (but I would understand if that is not an option for you since you probably have good reason to have made this property JPA-transient in the first place).

干杯

这篇关于JPA瞬态注释和JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆