fra*_*smi 0 spring spring-security spring-data-jpa jhipster angular
我正在开发 JHipster 应用程序,我有一个 Study 实体,它与 User 具有多对一的关系(因此一个用户可以进行多项研究)。我正在尝试更改对话框组件中的用户选择以创建新研究以自动选择当前登录的用户。
我已更改选择,以便只有单个用户应显示为选择的选项,在解决此问题后,我将禁用该字段或将其删除,以便自动设置study.user:
<select class="form-control" id="field_user" name="user [(ngModel)]="study.user" >
<option [ngValue]="user.id === study.user?.id ? study.user : user">{{user.login}}</option>
</select>
Run Code Online (Sandbox Code Playgroud)
虽然查询了 userService:
this.userService.query()
.subscribe((res: ResponseWrapper) => { this.user = res.json; }, (res: ResponseWrapper) => this.onError(res.json));
Run Code Online (Sandbox Code Playgroud)
它运行这个查询到 user.service.ts 中的 api:
private resourceUrl = 'api/users';
...
query(req?: any): Observable<ResponseWrapper> {
const options = createRequestOption(req);
return this.http.get(this.resourceUrl, options)
.map((res: Response) => this.convertResponse(res));
}
Run Code Online (Sandbox Code Playgroud)
UserResource.java 中的 GET 方法:
@GetMapping("/users")
@Timed
public ResponseEntity<UserDTO> getAllUsers() {
return ResponseUtil.wrapOrNotFound(
userService.getAllManagedUsers()
.map(UserDTO::new));
}
Run Code Online (Sandbox Code Playgroud)
在 UserService.java 中调用这个方法:
@Transactional(readOnly = true)
public Optional<User> getAllManagedUsers() {
return userRepository.findOneByLogin(SecurityUtils.getCurrentUserLogin());
}
Run Code Online (Sandbox Code Playgroud)
findOneByLogin 在 userRepository 中定义,它是 User 实体的 Spring Data JPA 存储库。
我的问题是,当我尝试从我的实体访问用户对象时,它是未定义的,抛出错误,例如:
错误类型错误:无法读取未定义的属性“id”
如果我理解正确,您有一个 Study ,它与 User 有关系,当您检索 Study 对象时: study.user 在您的问题中未定义 angular 代码。
您不能信任 angular 代码,因此在创建 Study 时用户选择不能在客户端中,因此您应该在 StudyMapper 中忽略它(假设您使用 DTO)或 StudyService 应该覆盖它。
JHipster 创建供管理员使用的视图和 API。在您的情况下,您想为只允许管理自己研究的简单用户构建 API,如果您尝试在同一类中解决两个用例,您的代码可能会变得混乱,并且可能会引入安全漏洞。因此,除非您想删除管理部分,否则我建议您拆分 2 个 API 和可能的视图。通过将 StudyResource on/api/study for admins 和 MyStudyResource on /api/user/study 设置在/api/user/study 上,您可以按角色不同地保护它们并避免您所看到的问题,因为您将拥有明确定义的上下文,而不是将 if/ then/else 一轮。
这样做的另一个原因是使用jhipster upgrade命令可以更轻松地升级 JHipster 生成的代码。
JHipster 不会设计您的 API,因为它确实了解您的业务领域。它为您提供了一个 CRUD 接口,用于从技术角度管理 REST API 和实体之上的数据。这就是为什么它为每个实体映射一个资源,而不是在使用 DDD 分析业务领域时最终得到的聚合。聚合在性能方面也更好,尤其是对于移动客户端,因为您最终会减少 API 调用。
您还可以使用https://github.com/cbornet/generator-jhipster-swagger-api-first添加 API
| 归档时间: |
|
| 查看次数: |
5669 次 |
| 最近记录: |