2017-02-01 2 views
6

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

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! –

+1

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. –

+0

hi @ Paul-Etienne, das wäre absolut großartig, danke! –

Antwort

1

ManagedUserVM ist eine Ansicht Modell so einfachste Weg, um Ihre zusätzlichen Felder, um es hinzuzufügen, kann ein view-Modell ein Aggregat von mehreren Einheiten sein. Auf diese Weise ändern Sie Ihren Service nicht, Ihr Client-Code muss nicht wissen, wie ein Benutzer auf dem Server gespeichert ist.

Dann auf Server, sollten Sie in Betracht ziehen, die UserExtra Einheit zu ändern, um dieselbe ID wie User anstelle einer generierten ID zu verwenden, verwenden Sie @MapIds. Sehen Sie diese nice article für Details.

+0

Vielen Dank, es hat funktioniert. Ich habe es in meinem ursprünglichen Post nicht erwähnt, aber ich hatte bereits versucht, die Felder in ManagedUserVM hinzuzufügen. Sieht so aus, als ob das einzige, was mir fehlte, die Ids abbildet, ich wusste nicht einmal, dass das möglich ist. Ich habe jetzt nur eine Abfrage, wie weiß der Server, welche Felder entsprechend dem senden, was der Client sendet? Ich habe nur die Felder und ihre Getter hinzugefügt, keinen speziellen Konstruktor. Liegt es nur daran, dass die Feldnamen übereinstimmen? –

+0

Wahrscheinlich, aber es sollte verifiziert werden. Könnten Sie Code anzeigen? Ich denke auch, dass es sehr nützlich sein sollte, dies als Tipp auf https://jhipster.github.io/tips/ –

+0

zu teilen. Okay, ich habe nur noch ein Problem, das ich beheben möchte, bevor ich den vollständigen Arbeitscode zeige und einen Pull mache Anfrage auf der Spitze Abschnitt von JHipster. Ich kann meine Telefonnummer und meinen Skype-Account in der registerAccount() - Funktion von AccountResource.java abrufen, habe aber Mühe, sie in meiner Datenbank zu speichern. Ich werde daran arbeiten und dir antworten, wenn es gelöst ist. –

Verwandte Themen