Ich entwickle eine Anwendung mit JHispter 3.12.2.JHipster: Registrieren eines Benutzers mit zusätzlichen Informationen
Da ich mehr Informationen benötigte als das, was JHipster bietet, habe ich eine Entität UserExtra erstellt, die zwei Strings enthält: eine Telefonnummer und eine Skype-Adresse. Ich verknüpfte diese Entität mit dem JHI_User in einer One-to-One-Beziehung.
Jetzt das Problem, das ich gegenüberstelle, ist, wenn ein Benutzer registriert, möchte ich ein neues UserExtra erstellen, das mit dem registrierten Benutzer verbunden ist.
Um das zu erreichen, habe ich mehrere Dinge auf der Client-Seite versucht.
Die Standard-JHipster-Registerseite funktioniert mit einer Variablen namens vm.registerAccount, die firstName, lastName, login, password usw. enthält.
Ich habe versucht, eine andere Variable vm.userExtra mit meiner Telefonnummer und Skype verwenden. Dann habe ich versucht, verschiedene Dinge:
In den register.controller.js, ich habe meine userExtra auf die Funktion create:
Auth.createAccount(vm.registerAccount, vm.userExtra).then(function() { vm.success = 'OK'; }).catch(function (response) { vm.success = null; if (response.status === 400 && response.data === 'login already in use') { vm.errorUserExists = 'ERROR'; } else if (response.status === 400 && response.data === 'e-mail address already in use') { vm.errorEmailExists = 'ERROR'; } else { vm.error = 'ERROR'; } });
ich die Funktion create von auth.service.js geändert
function createAccount (account, userExtra, callback) { var cb = callback || angular.noop;
return Register.save(account, userExtra, function() { return cb(account); }, function (err) { this.logout(); return cb(err); }.bind(this)).$promise; }</pre>
Schließlich habe ich aktualisiert, um die registerAccount Funktion von AccountResource.java auf der Serverseite: die Änderungen vorgenommen folgen:
public ResponseEntity registerAccount(@Valid @RequestBody ManagedUserVM managedUserVM, UserExtra userExtra) { ... }
Aber die registerAccount Funktion nicht einmal von dem, was ich erinnere mich, ausgeführt wurde.
Ich habe auch versucht, in dem Rückruf der Funktion create von register.controller.js wie diese die neuen Benutzer hinzufügen:
Auth.createAccount(vm.registerAccount).then(function (result) {
vm.userExtra.user = result;
UserExtra.save(vm.userExtra, function() { // success }, function() { // fail });
vm.success = 'OK';
})...
Aber ich war nur einen Fehler immer beim Versuch, die neue UserExtra zu speichern.
Ich bin mir ziemlich sicher, ich muss die Funktion registerAccount() in AccountResource.java ändern, aber ich kann einfach nicht die zusätzlichen Informationen abrufen, die ich von der Clientseite senden möchte. Ich habe es geschafft, einen neuen Benutzer innerhalb dieser Funktion zu erstellen und ihn mit dem JHI_User zu verknüpfen, aber ohne die zusätzlichen Informationen.
Es ist sehr wahrscheinlich, dass jemand dieses Problem bereits erkannt hat, was könnte die beste Lösung für dieses Problem sein?
Bearbeiten mit Lösung:
Dank Gaël Marziou, befestigte ich mein Problem.
Here's a minimal example of a project mit der Lösung, die ich hier beschreibe.
Auf der Client-Seite, in der Register.html Seite, die ich für meine Verwendung umgeschrieben habe, habe ich zwei Felder an vm gebunden.registerAccount Eigenschaften:
<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}}" />
In ManagedUserVM ich wirklich gerade hinzugefügt haben meine beiden Felder und deren Getter:
private String phone;
private String skype;
public String getPhone() {
return phone;
}
public String getSkype() {
return skype;
}
ich meine UserExtra Klasse geändert, um die Benutzer- und UserExtra IDs abzubilden, so dass sie gespiegelt werden. Dies beschleunigt den Abrufprozess und macht mehr Sinn als UserExtra eigentlich nur eine Erweiterung Mitglied ist:
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;
...
}
habe ich eine neue benutzerdefinierte Funktion create() in Userservice genannt, die meine beiden Felder zusätzlich zu den grundlegend denjenigen benötigt. Ich habe nicht die vorhandene Funktion aktualisieren, so dass ich die Testklassen nicht ändern müssen:
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;
}
Schließlich habe ich die registerAccount() Funktion von AccountResource aktualisiert meine benutzerdefinierte Funktion mit den beiden zusätzlichen Felder zu nennen:
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);
})
);
}
Hi @ Paul-Etienne, ich habe gerade Ihren Tipp auf der Website von jhipster gesehen. Eine Frage: Würde es Ihnen etwas ausmachen, ein minimales vollständiges Beispiel auf Github oder etwas ähnliches hochzuladen? Ich habe das gleiche mit einer Postgresql-Datenbank und dem neuesten jhipster mit der Option --skip-client versucht, aber es würde nicht funktionieren, und jetzt frage ich mich, ob ich etwas vermisse, wie "muss ich' @OneToOne erklären 'in der Benutzereinheit auch? Sind die Entitäten mit dem Generator oder von Hand erstellt? Benötigt die UserExtra-Entity' @ Entity' Annotation und Fragen wie diese. Wäre großartig! –
Hallo @ getoverit-DE, ich werde heute keine Zeit haben, um wirklich in Ihre Anfrage zu schauen, aber ich sollte Zeit haben, es morgen zu tun. –
hi @ Paul-Etienne, das wäre absolut großartig, danke! –