2015-04-26 15 views
6

Sto provando a utilizzare le funzionalità di auditing di Spring Data (in combinazione con Spring Boot e Spring Data Rest), ma i campi di controllo non vengono impostati in fase di salvataggio. Tutti i salvataggi determinano un'eccezione di vincolo dal tentativo di salvare un valore null "Creato da".Come configurare il controllo tramite Java Config in Spring Data (e Spring Data Rest)?

Secondo il spring data docs, dovrei essere in grado di mettere le annotazioni controllo riconosciute (@ CreatedDate/etc) sulla mia entità, e fa un AuditorAware <> a disposizione del contesto applicativo. So che il mio bean di auditor viene creato dall'impostazione di un breakpoint nel debugger.

Le mie domande sono:

1) E 'necessario per me creare un AuditingEntityListener, o dovrei aspettare un essere forniti da avere @EnableJpaAuditing? (non è chiaro nei documenti su java config)

2) Esiste un'altra configurazione nel codice seguente che mi manca per configurare il controllo automatico?

3) Sto chiamando il codice di creazione da un POST a Spring Data Rest, ci sono dei caveat speciali con l'utilizzo di questa funzionalità di controllo in combinazione con Spring Data Rest?

@Entity 
public class Tag implements Serializable { 

    // ... other fields omitted... 

    @CreatedDate 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date created = new Date(); 

    @CreatedBy 
    @Basic(optional = false) 
    @Column(name = "CREATED_BY", nullable = false, length = 24) 
    private String createdBy = ""; 

    @LastModifiedDate 
    @Basic(optional = false) 
    @Column(nullable = false) 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date updated = new Date(); 

    @LastModifiedBy 
    @Basic(optional = false) 
    @Column(name = "UPDATED_BY", nullable = false, length = 24) 
    private String updatedBy = ""; 

    // ... getters and setters were generated ... 

E la configurazione:

@EnableJpaAuditing 
@Configuration 
public class AuditingConfig { 

    @Bean 
    public AuditorAware<String> createAuditorProvider() { 
     return new SecurityAuditor(); 
    } 

    @Bean 
    public AuditingEntityListener createAuditingListener() { 
     return new AuditingEntityListener(); 
    } 

    public static class SecurityAuditor implements AuditorAware<String> { 
     @Override 
     public String getCurrentAuditor() { 
      Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
      String username = auth.getName(); 
      return username; 
     } 
    } 

} 

Qualsiasi aiuto è molto apprezzato, grazie!

risposta

8

1) È necessario creare un AuditingEntityListener, o dovrei aspettarmi che venga fornito da @EnableJpaAuditing? (non è chiaro nei documenti su java config)

Risposta: No, non è necessario definire il bean AuditingEntityListener. Invece devi specificare @EntityListeners(AuditingEntityListener.class) nella tua classe di dominio.

ad es.

@Entity 
@EntityListeners(AuditingEntityListener.class) 
public class Tag implements Serializable { 

} 

2) Esiste un'altra configurazione nel codice seguente che mi manca per configurare il controllo automatico?

Risposta: Altre impostazioni di configurazione sembrano corrette.

3) Sto chiamando il codice di creazione da un POST a Spring Data Rest, ci sono dei caveat speciali con l'utilizzo di questa funzionalità di controllo in combinazione con Spring Data Rest?

Risposta: Penso di no. Prova con le modifiche suggerite sopra. Dovrebbe funzionare.

+1

"specifica @EntityListeners (AuditingEntityListener.class) sulla classe del dominio" è stato il passaggio critico mancante! Questo non è menzionato nella documentazione di riferimento, probabilmente dovrebbe esserci un problema con Jira. – Jay

+0

@ Jay, è menzionato nella documentazione di riferimento di Spring Data Jpa. http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.auditing.configuration. È solo che è config XML e non in Java Config. –

+0

Ecco cosa intendevo: non è menzionato nella configurazione java. Grazie per la risposta! – Jay