小编Alv*_*son的帖子

REST:如何以"浅薄"的方式将java对象序列化为JSON?

假设我有以下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,则可获得奖励.谢谢!

rest spring json jpa java-ee

14
推荐指数
1
解决办法
6804
查看次数

在通用超类中实现Comparable <T>

我有一个抽象的通用超类,我扩展它来制作具有特定类型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)

我认为这很难看,因为现在为了扩展超类,你需要再次重复具体的类名作为自身的类型参数,这是奇怪的和违反直觉的.是否有一种更优雅的方式来完成我所缺少的同样的事情?

谢谢!

java generics

0
推荐指数
1
解决办法
2512
查看次数

标签 统计

generics ×1

java ×1

java-ee ×1

jpa ×1

json ×1

rest ×1

spring ×1