gpt4 book ai didi

spring - 如何使用 Spring Data JPA 和 Spring Security 实现 AuditorAware?

转载 作者:IT老高 更新时间:2023-10-28 13:53:32 26 4
gpt4 key购买 nike

我们在应用程序中使用 Hibernate/JPA、Spring、Spring Data 和 Spring Security。我有一个使用 JPA 映射的标准 User 实体。此外,我有一个 UserRepository

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

遵循 Spring Data 命名查询方法的约定。我有一个实体

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

我想使用 Spring Data 审计支持。 (如描述 here 。)因此我创建了一个 AuditorService 如下:

@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;
}
}

当我创建一个方法时

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

一切都正确连接,FooRepository 是 Spring Data CrudRepository。然后抛出一个 StackOverflowError 因为对 findByUsername 的调用似乎触发 hibernate 将数据刷新到触发 AuditingEntityListener 谁调用 的数据库>AuditorService#getCurrentAuditor 再次触发刷新等等。

如何避免这种递归?是否有加载 User 实体的“规范方式”?或者有没有办法防止 Hibernate/JPA 刷新?

最佳答案

我遇到了同样的问题,我所做的只是将 findByUsername(username) 方法上的传播更改为 Propagation.REQUIRES_NEW,我怀疑这是一个问题交易,所以我改用新的交易,这对我来说效果很好。我希望这会有所帮助。

@Repository
public interface UserRepository extends JpaRepository<User, String> {

@Transactional(propagation = Propagation.REQUIRES_NEW)
List<User> findByUsername(String username);
}

关于spring - 如何使用 Spring Data JPA 和 Spring Security 实现 AuditorAware?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14223649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com