我有一个实体如下:

@XmlRootElement

@Entity

@Table(name="CATEGORY")

@Access(AccessType.FIELD)

@Cacheable

@NamedQueries({

@NamedQuery(name="category.countAllDeleted", query="SELECT COUNT(c) FROM Category c WHERE c.deletionTimestamp IS NOT NULL"),

@NamedQuery(name="category.findAllNonDeleted", query="SELECT c from Category c WHERE c.deletionTimestamp IS NULL"),

@NamedQuery(name="category.findByCategoryName", query="SELECT c FROM Category c JOIN c.descriptions cd WHERE LOWER(TRIM(cd.name)) LIKE ?1")

})

public class Category extends AbstractSoftDeleteAuditableEntity implements za.co.sindi.persistence.entity.Entity, Serializable {

/**

*

*/

private static final long serialVersionUID = 4600301568861226295L;

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="CATEGORY_ID", nullable=false)

private int id;

@ManyToOne

@JoinColumn(name="PARENT_CATEGORY_ID")

private Category parent;

@OneToMany(cascade= CascadeType.ALL, mappedBy="category")

private List descriptions;

public void addDescription(CategoryDescription description) {

if (description != null) {

if (descriptions == null) {

descriptions = new ArrayList();

}

descriptions.add(description);

}

}

/* (non-Javadoc)

* @see za.co.sindi.entity.IDBasedEntity#getId()

*/

public Integer getId() {

// TODO Auto-generated method stub

return id;

}

/* (non-Javadoc)

* @see za.co.sindi.entity.IDBasedEntity#setId(java.io.Serializable)

*/

public void setId(Integer id) {

// TODO Auto-generated method stub

this.id = (id == null) ? 0 : id;

}

/**

* @return the parent

*/

public Category getParent() {

return parent;

}

/**

* @param parent the parent to set

*/

public void setParent(Category parent) {

this.parent = parent;

}

/**

* @return the descriptions

*/

public List getDescriptions() {

return descriptions;

}

/**

* @param descriptions the descriptions to set

*/

public void setDescriptions(List descriptions) {

this.descriptions = descriptions;

}

}

和:

@XmlRootElement

@Entity

@Table(name="CATEGORY_DESCRIPTION")

@Access(AccessType.FIELD)

@Cacheable

public class CategoryDescription extends AbstractModifiableAuditableEntity implements za.co.sindi.persistence.entity.Entity, Serializable {

/**

*

*/

private static final long serialVersionUID = 4506134647012663247L;

@EmbeddedId

private CategoryDescriptionKey id;

@MapsId("categoryId")

@ManyToOne/*(fetch=FetchType.LAZY)*/

@JoinColumn(name="CATEGORY_ID", insertable=false, updatable=false, nullable=false)

private Category category;

@MapsId("languageCode")

@ManyToOne/*(fetch=FetchType.LAZY)*/

@JoinColumn(name="LANGUAGE_CODE", insertable=false, updatable=false, nullable=false)

private Language language;

@Column(name="CATEGORY_NAME", nullable=false)

private String name;

@Column(name="DESCRIPTION_PLAINTEXT", nullable=false)

private String descriptionPlainText;

@Column(name="DESCRIPTION_MARKDOWN", nullable=false)

private String descriptionMarkdown;

@Column(name="DESCRIPTION_HTML", nullable=false)

private String descriptionHtml;

/* (non-Javadoc)

* @see za.co.sindi.entity.IDBasedEntity#getId()

*/

public CategoryDescriptionKey getId() {

// TODO Auto-generated method stub

return id;

}

/* (non-Javadoc)

* @see za.co.sindi.entity.IDBasedEntity#setId(java.io.Serializable)

*/

public void setId(CategoryDescriptionKey id) {

// TODO Auto-generated method stub

this.id = id;

}

/**

* @return the category

*/

public Category getCategory() {

return category;

}

/**

* @param category the category to set

*/

public void setCategory(Category category) {

this.category = category;

}

/**

* @return the language

*/

public Language getLanguage() {

return language;

}

/**

* @param language the language to set

*/

public void setLanguage(Language language) {

this.language = language;

}

/**

* @return the name

*/

public String getName() {

return name;

}

/**

* @param name the name to set

*/

public void setName(String name) {

this.name = name;

}

/**

* @return the descriptionPlainText

*/

public String getDescriptionPlainText() {

return descriptionPlainText;

}

/**

* @param descriptionPlainText the descriptionPlainText to set

*/

public void setDescriptionPlainText(String descriptionPlainText) {

this.descriptionPlainText = descriptionPlainText;

}

/**

* @return the descriptionMarkdown

*/

public String getDescriptionMarkdown() {

return descriptionMarkdown;

}

/**

* @param descriptionMarkdown the descriptionMarkdown to set

*/

public void setDescriptionMarkdown(String descriptionMarkdown) {

this.descriptionMarkdown = descriptionMarkdown;

}

/**

* @return the descriptionHtml

*/

public String getDescriptionHtml() {

return descriptionHtml;

}

/**

* @param descriptionHtml the descriptionHtml to set

*/

public void setDescriptionHtml(String descriptionHtml) {

this.descriptionHtml = descriptionHtml;

}

}

返回集合< Category>时使用JAX-RS并在JBoss Wildfly 8.2.0-Final上部署,我得到以下stacktrace:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: za.co.sindi.unsteve.persistence.entity.Category["descriptions"]->org.hibernate.collection.internal.PersistentBag[0]->za.co.sindi.unsteve.persistence.entity.CategoryDescription["category"]->za.co.sindi.unsteve.persistence.entity.Category["descriptions"]->

在像this question这样的问题中回答的答案需要使用杰克逊特定的注释.我的项目要求是严格遵守Java EE特定框架.有没有一个解决方案,我们可以用来防止无限递归而不使用杰克逊注释?如果没有,我们可以创建一个配置文件(XML文件等),杰克逊可以使用它来代替注释吗?原因是应用程序不仅必须绑定到Wildfly特定库.

java实体序列化_java – 在JPA实体序列化(JSON)上防止JAX-RS中...相关推荐

  1. java高性能序列化_Java最佳实践–高性能序列化

    java高性能序列化 在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论并演示如何将对象序列化用于高性能应用程序. 所有讨论的主题均基于用例,这些用例源于电信行业关键任务超 ...

  2. JPA教程:JPA概述、JPA实体生命周期、JPA实体映射关系、JPA查询语言

    JPA定义了Java ORM及实体操作API的标准.本文摘录了JPA的一些关键信息以备查阅. 如果有hibernate的基础,通过本文也可以快速掌握JPA的基本概念及使用. 1 JPA概述 JPA(J ...

  3. java实体中文字段_java - Spring JPA实体类是否可以包含不在数据库表中的非数据库字段 - SO中文参考 - www.soinside.com...

    我在SpringBoot中使用Spring JPA和Spring Data Rest.我有一个称为用户的数据库表和该表的实体.我没有此应用程序的控制器.@Entity @Table(name = &q ...

  4. java 为什么序列化_java类为什么要序列化

    将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 序列化使其他代码可以查看或 ...

  5. java fileupload 文件_java用Commons fileupload 文件的上传

    java用Commons fileupload 文件的上传 基于表单的文件上传 如果在表单中使用表单元素 />,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文 ...

  6. JAVA客户端数据传输_java模拟TCP通信实现客户端上传文件到服务器端

    java模拟TCP通信实现客户端上传文件到服务器端,供大家参考,具体内容如下 客户端 package com.zr; import java.io.FileInputStream; import ja ...

  7. java 网页 录音_Java+FlashWavRecorder实现网页录音并上传

    [注意] [前言] 肯定有需求要网页录音,并且要上传.这奇葩需求. 然后找到了FlashWavRecorder, [原始版本号] 1.下载 在上面的地址下载zip解压之后,目录里面有个index.ht ...

  8. java combobox大小_java – JComboBox首选大小,选择空值但不在ComboBoxModel中

    我有以下情况:在JCombobox中,首选大小基于最大的项目大小.但是,此计算不考虑为null呈现的值.它只关心模型中的值.因此,当渲染空值的文本大于另一个元素时,标签会被截断,并且我在末尾有三个点( ...

  9. java 恶搞程序_Java恶搞!强制关闭电脑上的程序进程!

    效果 最近写代码经常和各种进程打交道,发现了一个很有意思的黑科技. 我直接说有什么用吧,可以设置每隔多少时间检查某个程序是否在使用,如果在用,就强制关闭.比如,有的sb舍友晚上就是不睡觉,一边打游戏一 ...

最新文章

  1. 【winform程序】自定义webrowser控件调用IE的版本
  2. 为什么你投出去的简历,都石沉大海了?
  3. HTML选择器属于jq的选择器吗,JQuery 选择器
  4. NO--14 微信小程序,左右联动二
  5. Python的小整数对象池
  6. 字典生成工具——crunch
  7. 十天入门php,十天学会PHP之第十天
  8. 火山PC锐浪报表使用教程1(Grid++Report)
  9. Linux系统使用git命令制作patch补丁详解
  10. Oracle Enterprise Linux(OEL) 操作系统下载步骤及版本区别
  11. 计算机应用应届求职简历,计算机应用应届生个人简历模板
  12. Python:如何用python编写无限猴子定理
  13. requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
  14. 用s函数实现Lugre摩擦模型
  15. Hive常用窗口函数实战
  16. Whale帷幄 - 门面的力量丨提升进店客流
  17. 自我认知(一)——打破思维的枷锁
  18. linux内核信号处理机制--do_signal函数讲解 (适用mips架构)
  19. U-Boot1.2.0移植YC2440
  20. Linux网络服务之DNS域名解析服务

热门文章

  1. jQuery ligerUI中通过ligerDateEditor设置默认日期
  2. js 有关object 、array 等引用类型的赋值问题
  3. 【C语言】实参求值的顺序
  4. 一些前端常用工具的生命周期
  5. 阿里巴巴测试相关内容
  6. 函数式编程 模式_函数式编程模式:食谱
  7. 在Unterfranken中搜索河流:如何使用Elasticsearch在地图上查找要素
  8. 使用Express和MongoDB构建CRUD应用程序-第2部分
  9. Nginx 配置实现web解析php代码 过程记录
  10. Python3十大经典错误及解决办法