2015-06-23 21 views
0

在典型情况下与embedded resourcesSpring HATEOAS。嵌入资源+ CRUD的能力呢?

@Entity @Data 
class Item { 
    id, name 
    ... 
    @ManyToOne 
    @JoinColumn(name="status", referencedColumnName="ID") 
    private Status status; 
} 

@Entity @Data 
class Status { 
    id, name 
    ... 
    @JsonIgnore //break infinite reference loop during serialization 
    @OneToMany(mappedBy="status") 
    private List<Item> items; 
} 

而不必链接状态ID的项JSON的,我想包括状态对象项目 JSON

 { 
      "itemName": "abc", 
       ... , 
      "status": { 
       "statusName":"ACTIVE", 
        ... 
      } 
      "_links": { 
       ... 
      } 
     } 

我设法嵌入做任何以下:

  • 标记项目状态财产@RestResource(出口= FALSE)
@Entity @Data 
    class Item { 
     ... 
     @RestResource(exported=false) // <-- HERE 
     @ManyToOne 
     @JoinColumn(name="status", referencedColumnName="ID") 
     private Status status; 
  • 标志状态回购接口@RepositoryRestResource(...,出口= FALSE)
@RepositoryRestResource(collectionResourceRel="statuses", path="status", exported=false) 
    public interface StatusRepository extends JpaRepository<Status, String> 
  • Deleteting的状态实体库
// DELETED 
    @RepositoryRestResource 
    public interface StatusRepository extends JpaRepository<Status, String>{} 

问题:

任何的嵌入状态到项目JSON就像我想要的,但我没有状态储存库的访问了通过它的ID获取一个Status对象,或者对它做任何CRUD。

如何在父项中嵌入状态项目JSON和通过url仍CRUD状态?

回答

0

我实现它,如下所示:

@Entity @Data 
class Item { 
    @Id 
    @GeneratedValue(generator = "uuid2") 
    @GenericGenerator(name = "uuid2", strategy = "uuid2") 
    String id; 
    String name 

    @RestResource(exported = false) // <---- ADDED 
    @ManyToOne 
    @JoinColumn(name="status", referencedColumnName="ID") 
    private Status status; 
} 

@Entity @Data 
class Status { 
    @Id 
    @GeneratedValue(generator = "uuid2") 
    @GenericGenerator(name = "uuid2", strategy = "uuid2") 
    String id 
    String name 

    // <-------- DELETED REFERENCE TO PARENT OBJECT 
    //@OneToMany(mappedBy="status") 
    //private List<Item> items; 
} 

库为两个实体存在,因此它是可以做到CRUD上的状态的实体以及

@RepositoryRestResource(collectionResourceRel="items", path="items") 
public interface StatusRepository extends JpaRepository<Item, String> 
{} 

@RepositoryRestResource(collectionResourceRel="statuses", path="statuses") 
public interface StatusRepository extends JpaRepository<Status, String> 
{} 

为了子孙后代我会把它留在这里。

为了方便:

1)实体暴露在IDS JSON

/** 
* Exposing Ids as properties for entities specified 
*/ 
@Configuration 
public class ExposeIdConfig extends RepositoryRestMvcConfiguration { 
    @Override 
    protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { 
    config.exposeIdsFor(Item.class, Status.class); 
    } 
} 

因此获得的产品清单的样子:

{ 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/app/items{?page,size,sort}", 
     "templated": true 
    } 
}, 
"_embedded": { 
    "as": [ 
    { 
     "id": "29117425-f011-4ff9-8952-38b05d3df7f0", 
     "name": "item 1", 
     "status": { 
     "id": "e9192ae7-29f8-4d5e-ad62-cad8d87de9e2", 
     "name": "ACTIVE" 
     }, 
     "_links": { 
     "self": { 
      "href": "http://localhost:8080/app/items/29117425-f011-4ff9-8952-38b05d3df7f0" 
     } 
    }, 
    ... 
}