2017-08-19 115 views
0

我正在JHipster应用程序上工作,我有一个与用户具有多对一关系的研究实体(因此一个用户可以有许多研究)。我正在尝试更改用户在对话框组件中的选择,以创建一个新的研究来自动选择当前登录的用户。JHipster获取当前用户

我已经改变了选择,使得只有单个用户应显示为选择一个选项,解决这个问题,我要么禁用场或删除它,这样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> 

的userService是,虽然查询:

this.userService.query() 
    .subscribe((res: ResponseWrapper) => { this.user = res.json; }, (res: ResponseWrapper) => this.onError(res.json)); 

和运行这个查询API中user.service.ts:

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)); 
} 

GET方法在UserResource.java:

@GetMapping("/users") 
@Timed 
public ResponseEntity<UserDTO> getAllUsers() { 
    return ResponseUtil.wrapOrNotFound(
     userService.getAllManagedUsers() 
      .map(UserDTO::new)); 
} 

调用该方法UserService.java:

@Transactional(readOnly = true) 
public Optional<User> getAllManagedUsers() { 
    return userRepository.findOneByLogin(SecurityUtils.getCurrentUserLogin()); 
} 

findOneByLogin在userRepository,春节数据JPA库为用户自定义实体。

我的问题是,当我试图从我的实体访问用户对象,它是不确定的,抛出的错误,如:

ERROR TypeError: Cannot read property 'id' of undefined

回答

1

我没有类似的东西的API: 在xxxResource.java:

public String getCurrentUserLogin() { 
     org.springframework.security.core.context.SecurityContext securityContext = SecurityContextHolder.getContext(); 
     Authentication authentication = securityContext.getAuthentication(); 
     String login = null; 
     if (authentication != null) 
      if (authentication.getPrincipal() instanceof UserDetails) 
      login = ((UserDetails) authentication.getPrincipal()).getUsername(); 
      else if (authentication.getPrincipal() instanceof String) 
      login = (String) authentication.getPrincipal(); 

     return login; 
     } 

然后前xxxRepository.save地址:

User user=new User(); 
user=UserRepository.findOneByLogin(getCurrentUserLogin()).get(); 
Order.setUser(user); 

https://codefitter2.blogspot.com/2016/12/how-to-add-user-to-new-record-in.html

+0

谢谢尼科!这解决了我现在约2周的问题。虽然盖尔在建议我遵循API优先设计方面有很强的意义,但是这消除了我对依赖用户选择的依赖。我使用'study.setUser'而不是'Study.setUser'(其中order是我实体的名称),并根据我的IDE'User user = new User()';是一个多余的声明(我不想去除它)。 – fralewsmi

1

如果我理解正确的,你有有关系的研究用户和您检索Study对象时:study.user在您的问题中未定义在角码中。

您不能信任角码,所以创建Study时用户选择无法在客户端中,因此您应该在StudyMapper中忽略它(假设您使用DTO)或者StudyService应该覆盖它。

JHipster创建供管理员使用的视图和API。在您的情况下,您希望为仅允许管理自己的研究的简单用户构建API,但如果您尝试在同一类中解决这两个用例,那么您的代码可能会变得混乱,并且可能会引入安全漏洞。所以我建议你拆分2个API和可能的视图,除非你想删除管理部分。通过将StudyResource设置为/ api/Study for admins和MyStudyResource on/api/user/study,您可以通过角色以不同方式保护它们,避免您在视图中遇到的问题,因为您将拥有定义明确的上下文,而不是将if /然后/其他所有的一轮。

这样做的另一个原因是,使用jhipster upgrade命令可以更容易地升级JHipster生成的代码。

JHipster不设计您的API,因为它确实知道您的业务领域。它提供了一个CRUD接口,用于从技术角度管理REST API和实体之上的数据。这就是为什么它为每个实体映射一个资源,而不是使用DDD分析业务域时最终得到的聚合。特别是对于移动客户端,性能方面的聚合也会更好,因为您最终会减少API调用。

您还可以添加使用https://github.com/cbornet/generator-jhipster-swagger-api-first

+0

我已更新我的问题以澄清与用户的关系。这是创建新研究时的一个问题,在研究对话框中,有一个选择用于选择与研究相关的用户。我试图改变这种方式,以便只检索当前登录的用户,而不是检索应用程序中的所有用户 – fralewsmi

+0

Thankyou,我的API设计需要考虑 – fralewsmi

+1

绝对的,JHipster是一个非常棒的工具,但它只是一个技术工具没有商业洞察力。 –