Glo*_*ior 13 java serialization jackson deserialization elasticsearch
我有类似这样的课
public abstract class ElasticSearchValue<T> {
private Long txId;
private Long currentTxId;
private T previous;
public Long getTxId() {
return txId;
}
public void setTxId(Long txId) {
this.txId = txId;
}
public Long getCurrentTxId() {
return currentTxId;
}
public void setCurrentTxId(Long currentTxId) {
this.currentTxId = currentTxId;
}
public Object getPrevious() {
return previous;
}
public void setPrevious(T previous) {
this.previous = previous;
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个扩展上面课程的课程
public class DailyActivity extends ElasticSearchValue<DailyActivity> {
Long agentId;
Date date;
Long success;
public Long getAgentId() {
return agentId;
}
public void setAgentId(Long agentId) {
this.agentId = agentId;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Long getSuccess() {
return success;
}
public void setSuccess(Long success) {
this.success = success;
}
@Override
public String toString() {
return agentId + "_" + date.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我有一个DailyActivity类型的对象,当我尝试将其转换为json字符串时,我得到以下异常:
public abstract class ElasticSearchValue<T> {
private Long txId;
private Long currentTxId;
private T previous;
public Long getTxId() {
return txId;
}
public void setTxId(Long txId) {
this.txId = txId;
}
public Long getCurrentTxId() {
return currentTxId;
}
public void setCurrentTxId(Long currentTxId) {
this.currentTxId = currentTxId;
}
public Object getPrevious() {
return previous;
}
public void setPrevious(T previous) {
this.previous = previous;
}
}
Run Code Online (Sandbox Code Playgroud)
我在google上寻找解决方案,但我得到的解决方案要求将jsonIgnore放到以前的值,这不是我打算做的.有没有人遇到同样的问题?谢谢
编辑 我知道课堂上有一个循环,我问如何反序列化具有自引用的类?
bor*_*jab 13
在这种情况下,您需要注释与@JsonManagedReference和@JsonBackReference的关系,如下所示:
@ManyToOne
@JoinColumn(name = "company_id", referencedColumnName = "id")
@JsonBackReference
private Company company
Run Code Online (Sandbox Code Playgroud)
和
@OneToMany(mappedBy="company")
@JsonManagedReference
private Set<Employee> employee = new HashSet<Employee>();
Run Code Online (Sandbox Code Playgroud)
有一个很好的例子在这里
SerializationFeature有一个名为FAIL_ON_SELF_REFERENCESdefault is的属性,true但您可以设置false为跳过这种异常。
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.FAIL_ON_SELF_REFERENCES, false);
Run Code Online (Sandbox Code Playgroud)
如果你正在使用SpringBoot你可以简单地添加spring.jackson.serialization.fail-on-self-references=false
在你的application.properties
自我参考在这里:
public class DailyActivity extends ElasticSearchValue<DailyActivity> {
Run Code Online (Sandbox Code Playgroud)
你说的DailyActivity是 an ElasticSearchValue<DailyActivity>,它本身就是一个ElasticSearchValue<ElasticSearchValue<DailyActivity>>,而且这种情况是无限持续的......
更新:我会把它分成两节课。创建DailyActivity没有子类化ElasticSearchValue:
public class DailyActivity {
// the same content as your class above
Run Code Online (Sandbox Code Playgroud)
然后创建另一个类,如:
public class ElacticDailyActivity extends ElasticSearchValue<DailyActivity> {
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36411 次 |
| 最近记录: |