有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpring数据Rest如何更改抽象类集合的JSON序列化

我使用SpringBootV1。2.5和具有以下单表继承实体:

@Entity    
@table(name="view_items")
@DiscriminatorColumn(name="type")
public abstract class ViewItem {
   private int position;     
}

@Entity
@DiscriminatorValue(value="table")
public class Table extends ViewItem {}

@Entity
@DiscriminatorValue(value="chart")
public class Chart extends ViewItem {}

public interface ViewItemRepository 
    extends JpaRepository<ViewItem, Integer>{}

以及以下协会:

@Entity
@Table(name="views")
public class View {

    @OneToMany
    @JoinColumn(name="view_id")
    @OrderBy("position")
    private List<ViewItem> viewItems = new ArrayList<ViewItem>();

    ...
}

调用GET /views/{id}/viewItems返回按子类类型排序的集合(为了可读性,某些部分已被删除):

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked

Date: Wed, 23 Sep 2015 07:41:13 GMT

{
  "_embedded" : {        
    "tables" : [ {
      "position": 4,          
        ...
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/viewItems/3"
        }
      }
    } ],
    "charts" : [ {
      "position": 2,
        ...
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/viewItems/2"
        }
      }
    } ]
  }

有没有一种简单的方法来更改JSON序列化,即按如下位置排序view_items

{
  "_embedded" : {        
    "2": {
      "type": "chart",
        ...
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/viewItems/2"
        }
    },
    "4": {
      type: "table",
       ...
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/viewItems/3"
        }
  }

共 (1) 个答案

  1. # 1 楼答案

    所以我找到了答案

    View实体的ViewItems集合映射类型从List替换为Map,并在ViewItem实体上添加一个只读type字段,这样做的技巧是:

    @Entity
    @Table(name="views")
    public class View {
    
        @OneToMany
        @JoinColumn(name="view_id")
        @MapKey("position")
        private Map<Integer,ViewItem> viewItems = new HashMap<Integer,ViewItem>();
        ...
    }
    
    @Entity    
    @table(name="view_items")
    @DiscriminatorColumn(name="type")
    public abstract class ViewItem {
    
       @Column(insertable = false, updatable = false)
       public String type;
    
       ...  
    }
    

    编辑

    几个月后,多亏@aux(参见here),这里有了解决方案。必须实现RelProvider类,如here所述