'How to acess an entity under _links in Angular from Spring Data REST?

I encountered a problem which is very challenging to my Angular level. Could you give a help please?

In Spring Data REST the entity Worker has a @OneToMany bidirectional relationship with the entity TempworkEvent, shown below under _links. I would like to access TempworkEvent objects and their attributes through this relationship.

{
  "id" : 3,
  "name" : "Nadja Miller",
  "profession" : "Experte/in Anästhesiepflege",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/api/workers/3"
    },
    "worker" : {
       "href" : "http://localhost:8080/api/workers/3"
    },
    "tempworks" : {
       "href" : "http://localhost:8080/api/workers/3/tempworks"
    },
    "tempworkEvents" : {
       "href" : "http://localhost:8080/api/workers/3/tempworkEvents"
    }
}

In Angular the Worker entity successfully:

getWorkers(): Observable<Worker[]> {
   return this.httpClient.get<GetResponseWorkers>(this.workersUrl).pipe(
      map(response => response._embedded.workers)
   );
}

(...)

interface GetResponseWorkers {
  _embedded: {
    workers: Worker[];
  }
}

The challenge is how to access the Worker's tempworkEvents object and its attributes through _links:

"tempworkEvents" : {
   "href" : "http://localhost:8080/api/workers/3/tempworkEvents"
}


Solution 1:[1]

One of:

  1. Make an additional network request to get the TempworkEvents

  2. Don't have a TempworkEvent JPA repository, and Spring Data Rest will include the tempworkEvents data in the workers response

  3. or, use a Projection, like:

in entities/projections/MyWorkerProjection.java:

@Projection(name="foo", types={Worker.class})
public interface MyWorkerProjection {
  Long getId();
  String getName();
  String getProfession();
  List<TempworkEvent> getTempworkEvents();
}

Then call http://localhost:8080/api/workers/3?projection=foo

If you want to have "auto" projections, see: Spring Data REST: projection representation of single resource

You may want to create another interface for TempworkEvent, if you want to project its data as well as its links

Solution 2:[2]

let obj = {
  "id" : 3,
  "name" : "Nadja Miller",
  "profession" : "Experte/in Anästhesiepflege",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/api/workers/3"
    },
    "worker" : {
       "href" : "http://localhost:8080/api/workers/3"
    },
    "tempworks" : {
       "href" : "http://localhost:8080/api/workers/3/tempworks"
    },
    "tempworkEvents" : {
       "href" : "http://localhost:8080/api/workers/3/tempworkEvents"
    }
  }
}
console.log('tempworkEvents',obj._links.tempworkEvents);

You can access the object like above.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 rohithpoya