2017-11-18 5 views
0

ich ein einfaches Repository für meine App-Benutzer erstellt haben:@RepositoryEventHandler nicht aufgerufen zu werden

@RepositoryRestResource(path = "users") 
public interface AppUserRepository extends JpaRepository<AppUserModel, Long> { 

    List<AppUserModel> findByUsername(@Param("username") String username); 

} 

Ich brauche aber von Passwort-Verschlüsselung kümmern, bevor ein neuer Benutzer eingefügt wird. Dazu implementiert ich ein @RepositoryEventHandler:

@RepositoryEventHandler(AppUserModel.class) 
public class AppUserService { 

    @HandleBeforeSave 
    public void handleProfileSave(AppUserModel appUserModel) { 
     System.out.println("Before save .."); 
    } 

    @HandleBeforeCreate 
    public void register(AppUserModel appUserModel) { 
     System.out.println("Before create .."); 
    } 

} 

Das Problem ist, dass keiner der beiden Event-Handler ausgeführt zu werden. Als Ergebnis AppUserModel wird versucht, dauerhaft zu sein, aber scheitert, weil kein Salz (für das Passwort) generiert und eingestellt wurde - so kann ich sagen, dass die JpaRepository<AppUserModel, Long> funktioniert soweit.

{ 
"cause": { 
    "cause": { 
     "cause": null, 
      "message": "ERROR: null value in column "password_salt" violates not-null constraint Detail: Failing row contains (26, 2017-11-18 21:21:47.534, 2017-11-18 21:21:47.534, f, asd, null, [email protected])." 
     }, 
    "message": "could not execute statement" 
    }, 
    "message": "could not execute statement; SQL [n/a]; constraint [password_salt]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement" 
} 

Antwort

0

Es scheint mir, dass Sie nur AppUserService Bean erstellen müssen. Die einfachste Möglichkeit wäre, es mit Anmerkungen versehen mit @Component

@Component 
@RepositoryEventHandler(AppUserModel.class) 
public class AppUserService { 
    //... 
} 
+0

Oh. Ich habe gerade eine andere Lösung gefunden, die '@ Bean' in einer weiteren Konfigurationsklasse verwendet. Das hat auch funktioniert und ich werde das als eine andere Antwort veröffentlichen, aber Ihre Lösung ist natürlich viel einfacher. – displayname

0

Eine weitere Möglichkeit könnte die Bohne aus einer anderen Konfigurationsklasse zur Verfügung stellen:

@Configuration 
public class RepositoryConfiguration { 

    @Bean 
    AppUserEventHandler appUserService() { 
     return new AppUserEventHandler(); 
    } 
} 

Allerdings habe ich die Lösung von @varren bereitgestellt bevorzugen.

Verwandte Themen