JHipster:使用附加信息注册用户



我正在使用JHispter 3.12.2开发一个应用程序。

由于我需要比JHipster提供的更多的信息,我创建了一个实体UserExtra,其中包含两个字符串:一个电话号码和一个skype地址。我以一对一的关系将此实体链接到JHI_User。

现在我面临的问题是,当用户注册时,我想创建一个与注册用户相关联的新UserExtra。

为了实现这一点,我在客户端尝试了几件事。

标准JHipster注册页面的工作方式是使用一个名为vm.registerAccount的变量,该变量包含firstName、lastName、login和密码等

我尝试使用另一个变量vm.userExtra来保存我的电话号码和skype。然后,我尝试了几种方法:

  • 在register.controller.js中,我将userExtra传递给createAccount函数:

    Auth.createAccount(vm.registerAccount,vm.userExtra).then(function(){vm.success="确定";}).catch(函数(响应){vm.success=null;if(response.status===400&&response.data==='登录已在使用中'){vm.errorUserExists='ERROR';}else if(response.status==400&&response.data=="电子邮件地址已在使用中"){vm.errorEmailExists='ERROR';}其他{vm.error="error";}})
  • 我修改了auth.service.js的createAccount函数,以遵循所做的更改:

    函数createAccount(account,userExtra,callback){var cb=回调||angular.noop;
    
    return Register.save(account, userExtra,
    function () {
    return cb(account);
    },
    function (err) {
    this.logout();
    return cb(err);
    }.bind(this)).$promise;
    }</pre>
    
  • 最后,我在服务器端更新了AccountResource.java的registerAccount函数:

    public ResponseEntity registerAccount(@Valid@RequestBody ManagedUserVM ManagedUserVM,UserExtra UserExtra){…}

但registerAccount函数甚至没有从我记忆中执行。

我还尝试在register.controller.js的createAccount函数的回调中添加新用户,如下所示:

Auth.createAccount(vm.registerAccount).then(function (result) {
vm.userExtra.user = result;
UserExtra.save(vm.userExtra, function() { // success }, function() { // fail });
vm.success = 'OK';
})...

但我只是在尝试保存新的UserExtra时遇到了一个错误。

我很确定我需要修改AccountResource.java中的registerAccount()函数,但我无法检索到我试图从客户端发送的其他信息。我设法在这个函数中创建了一个新的User,并将其链接到JHI_User,但没有附加信息。

很可能有人已经面临这个问题,解决这个问题的最佳方案是什么?

使用解决方案编辑:

多亏了Gaël Marziou,我解决了我的问题。

下面是一个使用我在这里描述的解决方案的项目的最小示例。

在客户端,在我为使用而重写的register.html页面中,有两个字段绑定到vm.registerAccount属性:

<input class="form-control" id="phone" ng-model="vm.registerAccount.phone" placeholder="{{'global.form.phone.placeholder' | translate}}" />
...
<input class="form-control" id="skype" ng-model="vm.registerAccount.skype" placeholder="{{'global.form.skype.placeholder' | translate}}" />

在ManagedUserVM中,我实际上只是添加了我的两个字段及其getter:

private String phone;
private String skype;
public String getPhone() {
return phone;
}
public String getSkype() {
return skype;
}

我更改了UserExtra类来映射User和UserExtra id,以便对它们进行镜像。这加快了检索过程,更有意义,因为UserExtra实际上只是User:的扩展

public class UserExtra implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
@Column(name = "phone")
private String phone;
@Column(name = "skype")
private String skype;
@OneToOne
@MapsId
private User user;
...
}

我在UserService中创建了一个名为createUser()的新自定义函数,除了基本字段外,它还需要我的两个字段。我没有更新现有的函数,这样我就不必更改测试类:

public User createUser(String login, String password, String firstName, String lastName, String email,
String langKey, String phone, String skype) {
User newUser = new User();
Authority authority = authorityRepository.findOne(AuthoritiesConstants.USER);
Set<Authority> authorities = new HashSet<>();
String encryptedPassword = passwordEncoder.encode(password);
newUser.setLogin(login);
// new user gets initially a generated password
newUser.setPassword(encryptedPassword);
newUser.setFirstName(firstName);
newUser.setLastName(lastName);
newUser.setEmail(email);
newUser.setLangKey(langKey);
// new user is not active
newUser.setActivated(false);
// new user gets registration key
newUser.setActivationKey(RandomUtil.generateActivationKey());
authorities.add(authority);
newUser.setAuthorities(authorities);
userRepository.save(newUser);
userSearchRepository.save(newUser);
log.debug("Created Information for User: {}", newUser);
// Create and save the UserExtra entity
UserExtra newUserExtra = new UserExtra();
newUserExtra.setUser(newUser);
newUserExtra.setPhone(phone);
newUserExtra.setSkype(skype);
userExtraRepository.save(newUserExtra);
userExtraSearchRepository.save(newUserExtra);
log.debug("Created Information for UserExtra: {}", newUserExtra);
return newUser;
}

最后,我更新了AccountResource的registerAccount()函数,用两个额外的字段调用我的自定义函数:

public ResponseEntity<?> registerAccount(@Valid @RequestBody ManagedUserVM managedUserVM) {
HttpHeaders textPlainHeaders = new HttpHeaders();
textPlainHeaders.setContentType(MediaType.TEXT_PLAIN);
return userRepository.findOneByLogin(managedUserVM.getLogin().toLowerCase())
.map(user -> new ResponseEntity<>("login already in use", textPlainHeaders, HttpStatus.BAD_REQUEST))
.orElseGet(() -> userRepository.findOneByEmail(managedUserVM.getEmail())
.map(user -> new ResponseEntity<>("e-mail address already in use", textPlainHeaders, HttpStatus.BAD_REQUEST))
.orElseGet(() -> {
User user = userService
.createUser(managedUserVM.getLogin(), managedUserVM.getPassword(),
managedUserVM.getFirstName(), managedUserVM.getLastName(),
managedUserVM.getEmail().toLowerCase(), managedUserVM.getLangKey(),
managedUserVM.getPhone(), managedUserVM.getSkype());
mailService.sendActivationEmail(user);
return new ResponseEntity<>(HttpStatus.CREATED);
})
);
}

ManagedUserVM是一个视图模型,因此最简单的方法是向其中添加额外的字段,视图模型可以是多个实体的集合。这样您就不需要更改angular服务,您的客户端代码就不需要知道User是如何存储在服务器上的。

然后在服务器上,您应该考虑修改UserExtra实体,使其使用与User相同的id,而不是生成的id,使用@MapIds。有关详细信息,请参阅这篇非常好的文章。

最新更新