Большое спасибо за информацию, Фобос, я создал простое решение, которое хорошо работает.
Я опишу это ниже для тех, у кого может появиться такая же проблема в будущем:
Как и в моей текущей версии Jhipster (5.7.2) - я использовал помощник SecurityUtils для написания простой конечной точки API, чтобы получить текущего зарегистрированного пользователя (или, более конкретно, его метаданные - это произвольная сущность с 1 -1 сопоставление с пользовательской сущностью Jhipster).
Сначала я добавил метод в хранилище сущностей метаданных:
/**
* Spring Data repository for the UserMetadata entity.
*/
@SuppressWarnings("unused")
@Repository
public interface UserMetadataRepository extends JpaRepository<UserMetadata, Long> {
Optional<UserMetadata> findOneByUser(User user);
}
Я использую отдельные классы обслуживания и так называемое хранилище в классе обслуживания пользовательских метаданных:
/**
* Get the user metadata object that is associated with the currently logged in user
* @return an optional containing nothing, or the metadata object
*/
public Optional<UserMetadata> getUserMetadataForCurrentUser() {
Optional<UserMetadata> userMetadata = Optional.empty();
Optional<User> currentUser = SecurityUtils.getCurrentUserLogin().flatMap(userRepository::findOneByLogin);
if (currentUser.isPresent()) {
userMetadata = userMetadataRepository.findOneByUser(currentUser.get());
}
return userMetadata;
}
Обратите внимание, что я упростила задачу, поместив большую часть логики в API, чтобы клиент мог быть настолько глупым, насколько это возможно. Мне нравятся умные API и тупые клиенты.
Выше я использую securityUtils, чтобы получить логин пользователя, а затем нахожу метаданные этого пользователя по логину. Клиент никогда не должен запрашивать фактический объект пользователя.
Я передаю Optional типа UserMetadata на веб-слой, который использует ResponseUtil от Jhipster, чтобы либо вернуть объект внутри необязательного параметра, либо произошла ошибка:
/**
* GET /user-metadata/me : get the user metadata of the current user.
*
* @return the ResponseEntity with status 200 (OK) and with body the userMetadata, or with status 404 (Not Found)
*/
@GetMapping("/user-metadata/me")
@Timed
public ResponseEntity<UserMetadata> getUserMetadataForCurrentUser() {
log.debug("REST request to get UserMetadata for current user");
Optional<UserMetadata> userMetadata = userMetadataService.getUserMetadataForCurrentUser();
return ResponseUtil.wrapOrNotFound(userMetadata);
}
Тогда мы идем к передней части. В пользовательском сервисе Metadata Angular:
@Injectable({ providedIn: 'root' })
export class UserMetadataService {
public resourceUrl = SERVER_API_URL + 'api/user-metadata';
currentUserMetadata: UserMetadata;
constructor(protected http: HttpClient) {
this.getCurrentUserMetadata().subscribe(res => (this.currentUserMetadata = res.body));
}
getCurrentUserMetadata() {
return this.http.get<IUserMetadata>(`${this.resourceUrl}/me`, { observe: 'response' });
}
// Rest of File
Я решил установить глобально доступное значение, чтобы мои другие компоненты и службы могли просто получать переменную метаданных и не вызывать ее каждый раз.
Я создал метод для вызова новой конечной точки API и использовал этот метод в конструкторе, чтобы объект всегда был доступен клиенту.
Я пытался оттолкнуть сложность от нижестоящего потребителя, насколько смог. Компонент, который я изначально спрашивал, теперь может достичь цели с помощью трех строк кода:
this.company.employees.push(this.userMetadataService.currentUserMetadata);
this.project.participants.push(this.userMetadataService.currentUserMetadata);
this.team.members.push(this.userMetadataService.currentUserMetadata);
Остальное скрыто в службах и самом API.
Надеюсь, другие найдут эту информацию полезной.
Я попытался объяснить все, потому что это было очень запутанным, когда я впервые погрузился в кодовую базу. Jhipster делает много классных вещей для вас, но в моем случае это фактически привело к ощущению «это происходит с магией» против «я понимаю механику того, как это работает».
Теперь у меня есть лучшее представление о том, как работает эта конкретная функция!