Контроллер Spring возвращает объект клиенту - PullRequest
0 голосов
/ 05 августа 2020

Сгенерированный JHipster проект Spring и Angular имеет сгенерированный контроллер и конечную точку для получения единого объекта Plan по идентификатору и возврата его клиенту браузера.

Plan имеет отношение "один ко многим" с Task. Отношения были настроены также в Jhipster.

Проблема в том, что теперь я создал конечную точку для получения нового объекта Plan, который также имеет список связанных задач, но даже после изменения Angular для использования нового Конечная точка без плана теперь отображается в браузере.

Прокомментируйте, если для определения проблемы недостаточно общего доступа к проекту.

Контроллеры

@GetMapping("/plans/{id}") // JHIPSTER GENERATED METHOD
public ResponseEntity<PlanDTO> getPlan(@PathVariable Long id) {
    Optional<PlanDTO> planDTO = planService.findOne(id);
    return ResponseUtil.wrapOrNotFound(planDTO);
}

@GetMapping("/plantask/{id}") // NEW METHOD FOR PLANTASKDTO
public PlanTaskViewDTO getTaskAndPlanByPlanId(@PathVariable Long id) {
    log.debug("REST request to get Plan and Tasks by Plan id : {}", id);
    PlanTaskViewDTO planTaskViewDTO = planService.createPlanTaskViewDTO(id);
    return planTaskViewDTO;
}

Ниже приведен метод поиска в plan.service.ts с обновленным URL-адресом resourcePlanTaskURL для новой конечной точки, который передается в метод поиска:

plan.service.ts

type EntityResponseType = HttpResponse<IPlan>;
type EntityArrayResponseType = HttpResponse<IPlan[]>;
    
@Injectable({ providedIn: 'root' })
export class PlanService {
      public resourceUrl = SERVER_API_URL + 'api/plans';
      public resourceSearchUrl = SERVER_API_URL + 'api/_search/plans';
      public resourcePlanTaskUrl = SERVER_API_URL + 'api/plantask';         // NEW URL

constructor(protected http: HttpClient) {}
    find(id: number): Observable<EntityResponseType> {
    return this.http
      .get<IPlan>(`${this.resourcePlanTaskUrl}/${id}`, { observe: 'response' })
      .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res)));
   }

plan-detail.component.ts

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

import { IPlan } from 'app/shared/model/plan.model';

@Component({
  selector: 'jhi-plan-detail',
  templateUrl: './plan-detail.component.html',
})
export class PlanDetailComponent implements OnInit {
  plan: IPlan | null = null;

  constructor(protected activatedRoute: ActivatedRoute) {}

  ngOnInit(): void {
    this.activatedRoute.data.subscribe(({ plan }) => (this.plan = plan));
  }

  previousState(): void {
    window.history.back();
  }
}

plan.route.ts

@Injectable({ providedIn: 'root' })
export class PlanResolve implements Resolve<IPlan> {
  constructor(private service: PlanService, private router: Router) {}

  resolve(route: ActivatedRouteSnapshot): Observable<IPlan> | Observable<never> {
    const id = route.params['id'];
    if (id) {
      return this.service.find(id).pipe(
        flatMap((plan: HttpResponse<Plan>) => {
          if (plan.body) {
            return of(plan.body);     // BROWSER BREAKPT - THIS LINE DOES RETURN PLANTASK
          } else {
            this.router.navigate(['404']);
            return EMPTY;
          }
        })
      );
    }
    return of(new Plan());
  }
}
...<snip routes>

plan-detail.component. html

  <div *ngIf="plan">
  <h2><span>Plan</span> {{ plan.id }}</h2>    // NOTHING DISPLAYED

Проверка браузера показывает, что данные planTaskDTO передаются из серверной части клиенту с использованием нового api / plantask конечной точки.

Q: Какие еще изменения нужно внести, чтобы браузер по-прежнему отобразить PlanTaskDTO? (Используя приведенный выше фрагмент HTML, я бы по крайней мере ожидал увидеть идентификатор плана)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...