假设我有以下JPA实体:
@Entity
public class Inner {
@Id private Long id;
private String name;
// getters/setters
}
@Entity
public class Outer {
@Id private Long id;
private String name;
@ManyToOne private Inner inner;
// getters/setters
}
Run Code Online (Sandbox Code Playgroud)
Spring和Java EE都具有带有默认序列化器的REST实现,这些序列化器将实体与JSON进行编组,无需进一步编码.但是当转换Outer为JSON时,Spring和EE都嵌套了Inner它的完整副本:
// Outer
{
"id": "1234",
"name": "MyOuterName",
"inner": {
"id": "4321",
"name": "MyInnerName"
}
}
Run Code Online (Sandbox Code Playgroud)
这是正确的行为,但对我的Web服务有问题,因为对象图可以变得深/复杂并且可以包含循环引用.是否有任何方法可以配置提供的编组器以"浅"方式编组POJO /实体,而无需为每个编写器定制一个自定义JSON序列化器?一个适用于所有实体的自定义序列化程序都可以.我理想上喜欢这样的东西:
// Outer
{
"id": "1234",
"name": "MyOuterName",
"innerId": "4321"
}
Run Code Online (Sandbox Code Playgroud)
我也希望它能将JSON"解组"回到等效的java对象中.如果解决方案适用于Spring和Java EE,则可获得奖励.谢谢!
我有一个抽象的通用超类,我扩展它来制作具有特定类型ID的具体类:
public abstract class AbstractEntity<I> {
...
private I id;
private String name;
...
}
Run Code Online (Sandbox Code Playgroud)
我创建这样的具体类:
public class User extends AbstractEntity<Long> {...}
Run Code Online (Sandbox Code Playgroud)
现在我想使具体类与其他自己的实例相比(没有其他类型 - 这应该在编译时强制执行).默认情况下,该compareTo方法应该按名称排序,因此我想将其添加到超类中以避免重复代码.我想出来的唯一方法是使用这个丑陋的构造:
public abstract class AbstractEntity<I,T> implements Comparable<AbstractEntity<I,T>> {
...
private I id;
private String name;
...
@Override
public int compareTo(AbstractEntity<I,T> o) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
...
public class User extends AbstractEntity<Long,User> {...}
Run Code Online (Sandbox Code Playgroud)
我认为这很难看,因为现在为了扩展超类,你需要再次重复具体的类名作为自身的类型参数,这是奇怪的和违反直觉的.是否有一种更优雅的方式来完成我所缺少的同样的事情?
谢谢!