Angular: HTTP POST с несколькими параметрами не работает - PullRequest
1 голос
/ 19 марта 2020

Мой интерфейс сделан с Angular. Бэкэнд сделан с Java Spring.

У меня есть две сущности essen(meal) и essensplan (mealplan). Каждый essensplan состоит из пяти объектов essen, настроенных как ManyToMany Relationship в Java Spring.

Шаблон отображает каждый объект essen в поле выбора. С [ngValue]="essen" я передаю объект essen методу addEssenToEssensplan в моем компоненте и сервисе.

essensplan-detail.component. html

<form *ngIf="essensplan">
 <div class="form-group">
  <select [(ngModel)]="essen" class="form-control" [ngModelOptions]="{standalone: true}">
    <option *ngFor="let essen of speisekarte" [ngValue]="essen" label="{{essen.name}}"></option>
    </select>
  </div>
    <button (click)="addEssenToEssensplan(essen)" type="button" class="btn btn- 
    primary">Hinzufügen</button>
</form>

essensplan-detail.component.ts

  addEssenToEssensplan(essen: Essen): void {
    this.essensplanService.addEssenToEssensplan(this.essensplan, essen);
  }

essensplan.service.ts

  addEssenToEssensplan(essensplan: Essensplan | number, essen: Essen): Observable<Essen> {
    const essensplanId = typeof essensplan === 'number' ? essensplan : essensplan.id;
    const currentEssen = essen;
    const url = `${this.essensplanUrl}/${essensplanId}/add`;
    const data = {id: essensplanId, essen: currentEssen};
    return this.http.post<Essen>(url, data);
  }

Контроллер в Java Весна

    @PostMapping(path = "/{id}/add")
    public void addEssenToEssensplan(@PathVariable("id") int id, @RequestBody Essen essen) {
        essensplanService.addEssenToEssensplan(id, essen);
    }

Служба:

    @Transactional
    public Essensplan addEssenToEssensplan(int id, Essen essen) {

        Optional<Essensplan> optionalEssensplan = essensplanRepository.findById(id);
        if (optionalEssensplan.isPresent()) {
             Essensplan essensplan = optionalEssensplan.get();
            essensplan.getEssenProWoche().add(essen);
            return essensplan;
        } else return null;
    }

Я уже сделал POST-запрос через Почтальон клиента, например, http://localhost:8080/essensplan/2/add и работал. Мне кажется, что запрос POST не достигает моего Java Spring Controller.

1 Ответ

1 голос
/ 19 марта 2020

Ошибка в вашем объекте данных. Вам не нужно помещать essensplanId туда. Это не часть тела запроса, а PathVariable.

Попробуйте:

    addEssenToEssensplan(essensplan: Essensplan | number, essen: Essen): Observable<Essen> {
        const essensplanId = typeof essensplan === 'number' ? essensplan : essensplan.id;
        return this.http.post<Essen>(`${this.essensplanUrl}/${essensplanId}/add`, {essen});
    }

Редактировать:

Вы также должны подписаться на свое наблюдаемое в какой-то момент или иначе запрос никогда не будет выполнен:

  addEssenToEssensplan(essen: Essen): void {
    this.essensplanService.addEssenToEssensplan(this.essensplan, essen).subscribe();
  }
...