Сгенерированный 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, я бы по крайней мере ожидал увидеть идентификатор плана)