如何从 Spring Data REST 访问 Angular 中 _links 下的实体?

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

我遇到了一个对我的 Angular 水平来说非常具有挑战性的问题。你能帮忙吗?

在 Spring Data REST 中,实体 Worker 与实体 TempworkEvent 具有 @OneToMany 双向关系,如下所示 _links。我想通过这种关系访问 TempworkEvent 个对象及其属性。

{
  "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"
    }
}

在Angular中Worker实体成功:

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

(...)

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

挑战在于如何通过_links访问WorkertempworkEvents对象及其属性:

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

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);

您可以像上面那样访问对象。

其中之一:

  1. 发出额外的网络请求以获取 TempworkEvents

  2. 没有 TempworkEvent JPA 存储库,Spring Data Rest 将在 workers 响应中包含 tempworkEvents 数据

  3. 或者,使用 Projection,例如:

entities/projections/MyWorkerProjection.java 中:

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

然后调用http://localhost:8080/api/workers/3?projection=foo

如果您想要“自动”投影,请参阅:

如果要投影其数据及其链接,您可能需要为 TempworkEvent 创建另一个接口