Comment mettre en œuvre AuditorAware avec Spring Data JPA et de la Sécurité Printemps?

Nous utiliser Hibernate/JPA, le printemps, le Printemps des Données et de la Sécurité Printemps dans notre application. J'ai une User entité qui est mappé à l'aide de JPA. De plus, j'ai un UserRepository

public interface UserRepository extends CrudRepository<User, Long> {
    List<User> findByUsername(String username);
}

qui suit le Printemps de Données de la convention pour nommer les méthodes de requête. J'ai une entité

@Entity
public class Foo extends AbstractAuditable<User, Long> {
    private String name;
}

Je veux utiliser de Printemps de l'audit des Données de soutien. (Comme descripe ici.) J'ai donc créé un AuditorService comme suit:

@Service
public class AuditorService implements AuditorAware<User> {

    private UserRepository userRepository;

    @Override
    public User getCurrentAuditor() {
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
        List<User> users = userRepository.findByUsername(username);
        if (users.size() > 0) {
            return users.get(0);
        } else {
            throw new IllegalArgumentException();
        }
    }

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

Lorsque je crée une méthode

@Transactional
public void createFoo() {
    Foo bar = new Foo(); 
    fooRepository.save(foo);
}

Où tout est correctement câblé et FooRepository une source de Données CrudRepository. Puis un StackOverflowError est jeté depuis l'appel à findByUsername semble déclencher d'hibernation pour purger les données de la base de données qui déclenche AuditingEntityListener qui appelle AuditorService#getCurrentAuditor qui déclenche une nouvelle fois une couleur, et ainsi de suite.

Comment éviter cette récursivité? Est-il une "manière canonique" pour charger le User entité? Ou est-il un moyen pour empêcher Hibernate/JPA, la purge?

InformationsquelleAutor gregor | 2013-01-08