我正在开发一个JHipster应用程序,我有一个与用户有多对一关系的研究实体(所以一个用户可以有很多研究)。我正在尝试更改对话框组件中的用户选择以创建新的Study以自动选择当前登录的用户。
我已经更改了select,因此只有单个用户才会显示为select的选项,修复此问题后我会禁用该字段或将其删除,以便 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));
将此查询运行到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));
}
UserResource.java中的GET方法:
@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中定义,userRepository是User实体的Spring Data JPA存储库。
我的问题是,当我尝试从我的实体访问用户对象时,它是未定义的,抛出错误,例如:
错误类型错误:无法读取未定义的属性“id”
答案 0 :(得分:3)
如果我理解正确,你有一个与用户有关系的研究,当你检索一个研究对象时:study在你的角度代码问题中未定义。
您不能信任角度代码,因此在创建Study时用户选择不能在客户端中,因此您应该在StudyMapper中忽略它(假设您使用DTO)或者StudyService应该覆盖它。
JHipster创建适用于管理员的视图和API。在您的情况下,您希望为只允许管理自己的研究的简单用户构建API,如果您尝试在同一个类中解决这两个用例,您的代码可能会变得混乱并且您可能会引入安全漏洞。因此,除非您想删除管理部分,否则我建议您拆分2个API和可能的视图。通过在/ api / study上研究StudyResource和/ api / user / study上的MyStudyResource,您可以通过角色以不同方式保护它们,并避免您在视图中遇到的问题,因为您将拥有明确定义的上下文而不是if /然后/全部一轮。
这样做的另一个原因是使用jhipster upgrade
命令更容易升级JHipster生成的代码。
JHipster不会设计您的API,因为它确实了解您的业务领域。它为您提供了一个CRUD接口,可以从技术角度管理REST API和实体上方的数据。这就是为什么它为每个实体映射一个资源而不是聚合,这是您在使用DDD分析业务域时最终得到的。聚合在性能方面也更好,特别是对于移动客户端,因为最终减少了API调用。
您还可以使用https://github.com/cbornet/generator-jhipster-swagger-api-first
添加API答案 1 :(得分:1)
我做了类似的事情: 在xxxResource.java中:
//maps.ejs
<!DOCTYPE html>
<html>
<head>
<style>
#map {
height: 400px;
width: 100%;
}
</style>
</head>
<title>Google Maps API</title>
<body>
<h3>My Google Maps Demo</h3>
<script>
function initMap() {
var uluru = {
lat: <%=lat%>,
lng: <%=lng%>
};
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 14,
center: uluru
});
var infowindow = new google.maps.InfoWindow();
var service = new google.maps.places.PlacesService(map);
service.getDetails({
placeId: <%=place_id%>
}, function(place, status) {
console.log(place);
if (status === google.maps.places.PlacesServiceStatus.OK) {
var marker = new google.maps.Marker({
map: map,
position: place.geometry.location
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent(
'<div><strong>' + place.name + '</strong><br>' +
'Place ID: ' + place.place_id + '<br>' +
place.formatted_address + '<br>' +
"Rating : " + place.rating + '</div>');
infowindow.open(map, this);
});
}
});
</script>
<script async defer src="https://maps.googleapis.com/maps/api/js?key=<%=process.env.API_KEY%>&libraries=places&callback=initMap">
</script>
<div id="map"></div>
</body>
</html>
然后在 xxxRepository.save 之前添加:
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;
}
请参阅https://codefitter2.blogspot.com/2016/12/how-to-add-user-to-new-record-in.html