当前位置: 首页 > 知识库问答 >
问题:

直接自引用导致循环超类问题JSON

汝彭薄
2023-03-14

我尝试了几个我在搜索时发现的东西,但没有任何帮助,或者我没有正确地实现它。

我得到的错误

Direct self-reference leading to cycle (through reference chain: io.test.entity.bone.Special["appInstance"]->io.test.entity.platform.ApplicationInstance["appInstance"])

这两个都扩展了基实体,并且在基(超类)中,它还有一个AppInstance

基实体类似于以下内容

@MappedSuperclass
public abstract class BaseEntity implements Comparable, Serializable {

@ManyToOne
protected ApplicationInstance appInstance;

//getter & setter

}

应用程序实体如下所示

public class ApplicationInstance extends BaseEntity implements Serializable { 
   private List<User> users;
// some other properties (would all have the same base and application instance . User entity will look similar to the Special.)
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "objectType")
@JsonIgnoreProperties({"createdBy", "appInstance", "lastUpdatedBy"})
public class Special extends BaseEntity implements Serializable {

    @NotNull
    @Column(nullable = false)
    private String name;

    @Column(length = Short.MAX_VALUE)
    private String description;

    @NotNull
    @Column(nullable = false)
    private Double price;

    @OneToOne
    private Attachment image;

    @Enumerated(EnumType.STRING)
    @ElementCollection(targetClass = SpecialTag.class)
    @CollectionTable(name = "special_tags")
    @Column(name = "specialtag")
    private List<SpecialTag> specialTags;

    @Temporal(TemporalType.TIME)
    private Date specialStartTime;

    @Temporal(TemporalType.TIME)
    private Date specialEndTime;

    @Enumerated(EnumType.STRING)
    @ElementCollection(targetClass = WeekDay.class)
    @CollectionTable(name = "available_week_days")
    @Column(name = "weekday")
    private List<WeekDay> availableWeekDays;

    @OneToMany(mappedBy = "special", cascade = CascadeType.REFRESH)
    private List<SpecialStatus> statuses;

    @OneToMany(mappedBy = "special", cascade = CascadeType.REFRESH)
    private List<SpecialReview> specialReviews;

    @Transient
    private Integer viewed;

    private Boolean launched;

    @OneToMany(mappedBy = "special")
    private List<CampaignSpecial> specialCampaigns;


  @Override
  @JsonIgnore
  public ApplicationInstance getAppInstance() {
    return super.getAppInstance(); 
  }
}
@GET
@Path("{ref}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(value = MediaType.TEXT_PLAIN)
public Special findByGuestRef(@PathParam("ref") String pRefeference) {
  // find the special and return it
 return special;
}

在特殊实体上,我尝试了以下操作

  • 已添加jsonIgnoreProperties
  • 为appInstance添加了一个重写,以便使用@jsonIgnore
  • 进行注释
  • @JsonIdentityInfo

以上链接

  • https://stackoverflow.com/A/29632358/4712391
  • Jackson序列化:如何忽略超类属性
  • Jackson自我引用导致循环

这些解决方案都行不通。我做错什么了吗?

注意:是否也可以编辑特殊的,因为其他实体在不同的包中,不想编辑他们。

共有1个答案

权黎昕
2023-03-14

通常在响应中排除属性就像在getter中添加@jsonignore注释一样容易,但是如果您不想将此注释添加到父类中,则可以重写getter,然后在其上添加注释:

public class Special extends BaseEntity implements Serializable {
    ...
    @JsonIgnore
    public ApplicationInstance getAppInstance() {
        return this.appInstance;
    }
    ...
}

注意:由于有几个框架,请确保您使用了正确的@jsonignore注释,否则它将被忽略。

另一个更“手动”的选择是为响应创建一个bean,它将是特殊实例的子集:

@GET
@Path("{ref}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(value = MediaType.TEXT_PLAIN)
public SpecialDTO findByGuestRef(@PathParam("ref") String pRefeference) {
  // find the special and return it
 return new SpecialDTO(special);
}


public class SpecialDTO {

    //declare here only the attributes that you want in your response

    public SpecialDTO(Special sp) {
        this.attr=sp.attr; // populate the needed attributes
    }

}
 类似资料:
  • 本文向大家介绍HashMap 多线程操作导致死循环问题?相关面试题,主要包含被问及HashMap 多线程操作导致死循环问题?时的应答技巧和注意事项,需要的朋友参考一下 主要原因在于 并发下的Rehash 会造成元素之间会形成一个循环链表。不过,jdk 1.8 后解决了这个问题,但是还是不建议在多线程下使用 HashMap,因为多线程下使用 HashMap 还是会存在其他问题比如数据丢失。并发环境下

  • 问题内容: 我真的没有得到这个,所以如果有人可以解释它是如何工作的,我将非常感激。我有两个应用程序,“帐户”和“主题” …这是我的设置列表: 在帐户中,我正在尝试执行以下操作: 在我的主题模型中: Django踢出以下错误: 这是某种循环进口问题吗?我尝试使用一个懒惰的引用,但这似乎也不起作用! 问题答案: 删除的导入,并将模型名称用作字符串。

  • 我正在进行搜索,然后循环搜索结果。这会导致我的代码被锁定,更糟糕的是,它会锁定数据库,使其无法进一步使用。即使在浏览器关闭之后。当然,在我再次尝试我的代码之前,这种“锁定”似乎会在一段时间后被清除。我将改变我执行这项特定任务的方式,但我很好奇是什么导致了这种锁定。

  • 我的期望: 如果用户输入的Int不在正确的范围内,程序将给他另一次机会,直到用户给出正确的类型。 所以,我需要一个块。但我有一个无限循环。 我的代码: 我读到: 重置. nextLine()扫描仪 使用扫描仪。扫描仪后面的nextLine()。nextInt() nextInt()的扫描仪错误 扫描仪在使用next()或nextFoo()后跳过nextLine()? 如何使用java.util.扫

  • 我在反序列化遵循以下格式的Json数组时遇到了一些问题: 它基本上是一个类别数组,其中每个类别也可以有一个子类别列表,依此类推。我的类模型看起来有点像这样: 现在,Gson显然抱怨循环引用。有没有办法解析这个Json输入,因为我不能假设有多少个类别级别?提前感谢。 编辑:以防万一有人有类似的问题,根据Spaeth的回答,我将解决方案调整为使用反射的更一般的情况。唯一的要求是JSON数组表示的对象列

  • 我是java的新手,我正在编写这个简短的程序,您可以在其中猜测1到10之间的数字。正确的数字存储为整数。如果您猜测较低的数字,它应该说“正确的数字较高”,如果您猜测较高,它应该说“正确的数字较低”。这是我所拥有的: 所以很明显这是行不通的,因为如果你输入一个更小的数字,它会跳到下一个数字,即使这个数字更大,它也是正确的。那么,我如何解决这个问题,让它检查两个语句呢?抱歉解释得不好。谢了。