Shawn Sherwood
Shawn Sherwood

Reputation: 1998

How to add elements in a many-to-many relationship via Spring's @RepositoryRestResource REST API?

I'm having trouble figuring out exactly how to use the @RepositoryRestResource interface to create many-to-many relationships between two fairly simple entities.

For example, I have a simple parent-child entity relationship like this:

@Entity
public class ParentEntity {
    @Id
    @GeneratedValue
    private Long id;

   @ManyToMany
   private List<ChildEntity> children;
}

@Entity
public class ChildEntity {
    @Id
    @GeneratedValue
    private Long id;

    @ManyToMany(mappedBy="children")
    private List<ParentEntity> parents;
}

My repositories are using the vanilla Spring @RepositoryRestResource HATEOS API:

@RepositoryRestResource(collectionResourceRel = "parents", path = "parents")
public interface ParentRepository extends PagingAndSortingRepository<ParentEntity, Long> {
}

@RepositoryRestResource(collectionResourceRel = "children", path = "children")
public interface ChildRepository extends PagingAndSortingRepository<ChildEntity, Long> {
}

I’ve been successful in using POST to create the individual ParentEntity and ChildEntity but I can’t seem to figure out how to PUT/PATCH the relationships between the two using the built-in interface.

It seems like I should be able to use a PUT to send JSON to something like http://localhost:8080/api/parents/1/children, but so far I'm not finding a structure that works.

Upvotes: 12

Views: 8170

Answers (2)

Selindek
Selindek

Reputation: 3423

I always hated that text/uri-list content-type, so I did some research and it turned out there is also an undocumented JSON format which can be used:

{
  "_links":{
    "rel":"/555",
    "rel":"/556"
  }
}

The rel of the links could be anything except empty string, they could be all the same. The link part could be the whole URL form the self link of the referenced object, but the last part of the URL is enough. ( forseslash +id)

Upvotes: 4

Shawn Sherwood
Shawn Sherwood

Reputation: 1998

I found an answer here: How to update reference object in Spring-data rest?

By using "Content-Type: text/uri-list" instead of JSON, it is possible to "add" a resource to the collection with a PUT and pass in the URI. You can remove the resource with a DELETE.

After some digging, I discovered that the Spring documentation does describe this: http://docs.spring.io/spring-data/rest/docs/2.2.0.RELEASE/reference/html/#repository-resources.association-resource.

Upvotes: 14

Related Questions