ngrx实体(数据)多个实体删除休息后端包含的错误类型

发布于 2025-01-28 02:41:51 字数 2851 浏览 1 评论 0原文

我目前正在努力删除多个实体,并在NGRX中保存多个实体模式。这是当前的问题:

我的UI EntityCacheservice:

@Injectable({ providedIn: 'root' })
export class PlayerService extends EntityCollectionServiceBase<Player> {

  changes: ChangeSetItem[] = [];

  constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory,
              private entityCacheDispatcher: EntityCacheDispatcher) {
    super('Player', serviceElementsFactory);
  }

  public createPlayerToBatch(players: Player) {
    let cs = new ChangeSetItemFactory().add("Player", players);
    this.changes.push(cs);
  }

  public updatePlayerToBatch(players: Player) {
    let cs = new ChangeSetItemFactory().update<Player>("Player", {id: players.id, changes: players});
    this.changes.push(cs);
  }

  // TODO: wrong type in backend here ...
  public deletePlayerToBatch(players: Player) {
    let cs = new ChangeSetItemFactory().delete("Player", players.id.toString());
    this.changes.push(cs);
  }

  public resetChanges() {
    this.changes = [];
  }

  public saveChangesToDatabase() {
    console.log("ChangeSetItems: ", this.changes);

    if(this.changes.length == 0) {
      // no changes
    }

    // https://blog.angular-university.io/ngrx-entity/
    this.entityCacheDispatcher.saveEntities(this.changes, environment.baseURL + 'player/crud/dispatcher')
        .pipe(
            map(response => response)
        );
  }

我的休息端点看起来像:

@POST
    @Path("player/crud/dispatcher")
    public Response multipleCrudDispatcher(ChangeSet<Player> cs) {

        ChangeItem<Player>[] items;
        items = cs.getChanges();

        Arrays.stream(items).forEach(changeItem -> {

            // Get alle affected entities from change item
            switch (changeItem.getOp()) {
                case Add:
                    System.out.println("ADD");
                    // Make the update database logic
                    handelAdd(changeItem.getEntities());
                    break;
                case Delete:
                    System.out.println("DELETE" );
                    // Make the update database logic
                    //handelDelete((String[]) changeItem.getEntities());
                    break;
                case Update:
                    System.out.println("UPDATE");
                    // Make the update database logic
                    handelUpdates(changeItem.getEntities());
                    break;
                case Upsert:
                    System.out.println("UPSERT");

                    break;
                default:

            }
        });

        return Response.ok(cs).build();
    }

端点期望在后端中更改类型“ player”,这是来自前端的相同结构。这也适用于Create,upSert,都很好地更新,因为它们还包含播放器对象列表。但是使用删除它不起作用:-(。删除期望带有字符串或数字的ID列表...这会导致后端错误,因为Java试图创建一个播放器对象。有人知道我如何可以解决这个难看的问题吗?

I am currently struggling with deleting multiple entities and the save multiple entities pattern in NgRx. Here is the current problem:

My UI EntityCacheService:

@Injectable({ providedIn: 'root' })
export class PlayerService extends EntityCollectionServiceBase<Player> {

  changes: ChangeSetItem[] = [];

  constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory,
              private entityCacheDispatcher: EntityCacheDispatcher) {
    super('Player', serviceElementsFactory);
  }

  public createPlayerToBatch(players: Player) {
    let cs = new ChangeSetItemFactory().add("Player", players);
    this.changes.push(cs);
  }

  public updatePlayerToBatch(players: Player) {
    let cs = new ChangeSetItemFactory().update<Player>("Player", {id: players.id, changes: players});
    this.changes.push(cs);
  }

  // TODO: wrong type in backend here ...
  public deletePlayerToBatch(players: Player) {
    let cs = new ChangeSetItemFactory().delete("Player", players.id.toString());
    this.changes.push(cs);
  }

  public resetChanges() {
    this.changes = [];
  }

  public saveChangesToDatabase() {
    console.log("ChangeSetItems: ", this.changes);

    if(this.changes.length == 0) {
      // no changes
    }

    // https://blog.angular-university.io/ngrx-entity/
    this.entityCacheDispatcher.saveEntities(this.changes, environment.baseURL + 'player/crud/dispatcher')
        .pipe(
            map(response => response)
        );
  }

My Rest Endpoint looks like:

@POST
    @Path("player/crud/dispatcher")
    public Response multipleCrudDispatcher(ChangeSet<Player> cs) {

        ChangeItem<Player>[] items;
        items = cs.getChanges();

        Arrays.stream(items).forEach(changeItem -> {

            // Get alle affected entities from change item
            switch (changeItem.getOp()) {
                case Add:
                    System.out.println("ADD");
                    // Make the update database logic
                    handelAdd(changeItem.getEntities());
                    break;
                case Delete:
                    System.out.println("DELETE" );
                    // Make the update database logic
                    //handelDelete((String[]) changeItem.getEntities());
                    break;
                case Update:
                    System.out.println("UPDATE");
                    // Make the update database logic
                    handelUpdates(changeItem.getEntities());
                    break;
                case Upsert:
                    System.out.println("UPSERT");

                    break;
                default:

            }
        });

        return Response.ok(cs).build();
    }

The endpoint expects a changeSet of type "Player" in the backend, the same structure that comes from the frontend. This works also with create, upsert, update all very well, because they also contain a list of player objects. But with DELETE it doesn't work :-(. The DELETE expects an ID list with strings or numbers ... which leads to an error in the backend, because Java tries to create a player object. Does anyone have an idea how I can solve this unsightly problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文