【问题标题】:java.lang.StackOverflowError when trying to update any entity with @CreatedBy尝试使用 @CreatedBy 更新任何实体时出现 java.lang.StackOverflowError
【发布时间】:2016-04-17 15:22:09
【问题描述】:

this old spring 论坛帖子中描述的问题很好。

现在我遇到了同样的问题。当我尝试通过 Web 请求更新具有 @CreatedBy Employee employee 字段的任何实体时,会发生 exception

stacktrace 日志的前 100 行:

2016-01-12 22:14:02.941 ERROR 8720 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: java.lang.StackOverflowError] with root cause
java.lang.StackOverflowError: null
    at java.util.Collections$SynchronizedMap.get(Unknown Source) ~[na:1.8.0_66]
    at org.springframework.data.util.ClassTypeInformation.from(ClassTypeInformation.java:74) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.data.mapping.context.AbstractMappingContext.hasPersistentEntityFor(AbstractMappingContext.java:148) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.data.mapping.context.PersistentEntities.getPersistentEntity(PersistentEntities.java:62) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.data.auditing.MappingAuditableBeanWrapperFactory.getBeanWrapperFor(MappingAuditableBeanWrapperFactory.java:76) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.data.auditing.AuditingHandler.touch(AuditingHandler.java:139) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.data.auditing.AuditingHandler.markModified(AuditingHandler.java:134) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.data.jpa.domain.support.AuditingEntityListener.touchForUpdate(AuditingEntityListener.java:96) ~[spring-data-jpa-1.9.0.RELEASE.jar:na]
    at sun.reflect.GeneratedMethodAccessor147.invoke(Unknown Source) ~[na:na]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_66]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_66]
    at org.hibernate.jpa.event.internal.jpa.ListenerCallback.performCallback(ListenerCallback.java:32) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.jpa.event.internal.jpa.CallbackRegistryImpl.callback(CallbackRegistryImpl.java:95) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.jpa.event.internal.jpa.CallbackRegistryImpl.preUpdate(CallbackRegistryImpl.java:59) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.jpa.event.internal.core.JpaFlushEntityEventListener.invokeInterceptor(JpaFlushEntityEventListener.java:51) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.handleInterception(DefaultFlushEntityEventListener.java:325) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:276) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:143) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:216) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:85) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.event.internal.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:44) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1193) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1261) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:567) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:482) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.jpa.criteria.compile.CriteriaQueryTypeQueryAdapter.getSingleResult(CriteriaQueryTypeQueryAdapter.java:54) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:206) ~[spring-data-jpa-1.9.0.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:78) ~[spring-data-jpa-1.9.0.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:100) ~[spring-data-jpa-1.9.0.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:91) ~[spring-data-jpa-1.9.0.RELEASE.jar:na]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:454) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:432) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) ~[spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ~[spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:101) ~[spring-data-jpa-1.9.0.RELEASE.jar:na]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at com.sun.proxy.$Proxy474.findByLogin(Unknown Source) ~[na:na]
    at point.office.CurrentUserImpl.get(CurrentUserImpl.java:42) ~[bin/:na]
    at sun.reflect.GeneratedMethodAccessor290.invoke(Unknown Source) ~[na:na]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_66]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_66]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) ~[spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at com.sun.proxy.$Proxy480.get(Unknown Source) ~[na:na]
    at point.office.SpringSecurityAuditorAware.getCurrentAuditor(SpringSecurityAuditorAware.java:21) ~[bin/:na]
    at point.office.SpringSecurityAuditorAware.getCurrentAuditor(SpringSecurityAuditorAware.java:1) ~[bin/:na]
    at org.springframework.data.auditing.AuditingHandler.touchAuditor(AuditingHandler.java:166) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.data.auditing.AuditingHandler.touch(AuditingHandler.java:145) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.data.auditing.AuditingHandler.markModified(AuditingHandler.java:134) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.data.jpa.domain.support.AuditingEntityListener.touchForUpdate(AuditingEntityListener.java:96) ~[spring-data-jpa-1.9.0.RELEASE.jar:na]
    at sun.reflect.GeneratedMethodAccessor147.invoke(Unknown Source) ~[na:na]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_66]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_66]
    at org.hibernate.jpa.event.internal.jpa.ListenerCallback.performCallback(ListenerCallback.java:32) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.jpa.event.internal.jpa.CallbackRegistryImpl.callback(CallbackRegistryImpl.java:95) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.jpa.event.internal.jpa.CallbackRegistryImpl.preUpdate(CallbackRegistryImpl.java:59) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.jpa.event.internal.core.JpaFlushEntityEventListener.invokeInterceptor(JpaFlushEntityEventListener.java:51) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.handleInterception(DefaultFlushEntityEventListener.java:325) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:276) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:143) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:216) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:85) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.event.internal.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:44) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1193) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1261) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87) ~[hibernate-core-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:567) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:482) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.hibernate.jpa.criteria.compile.CriteriaQueryTypeQueryAdapter.getSingleResult(CriteriaQueryTypeQueryAdapter.java:54) ~[hibernate-entitymanager-5.0.3.Final.jar:5.0.3.Final]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:206) ~[spring-data-jpa-1.9.0.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:78) ~[spring-data-jpa-1.9.0.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:100) ~[spring-data-jpa-1.9.0.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:91) ~[spring-data-jpa-1.9.0.RELEASE.jar:na]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:454) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:432) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) ~[spring-data-commons-1.11.0.RELEASE.jar:na]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) ~[spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ~[spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:101) ~[spring-data-jpa-1.9.0.RELEASE.jar:na]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at com.sun.proxy.$Proxy474.findByLogin(Unknown Source) ~[na:na]
    at point.office.CurrentUserImpl.get(CurrentUserImpl.java:42) ~[bin/:na]

我的AuditorAware 实现是:

@Component
public class SpringSecurityAuditorAware implements AuditorAware<Employee> {

    private final CurrentUser currentUser;

    @Autowired
    public SpringSecurityAuditorAware(CurrentUser currentUser) {
        this.currentUser = currentUser;
    }

    @Override
    public Employee getCurrentAuditor() {
        return currentUser.get();
    }

}

而我的CurrentUser 服务实现是:

@Service
public class CurrentUserImpl implements CurrentUser {

    private final EmployeeRepository employeeRepository;

    @Autowired
    public CurrentUserImpl(EmployeeRepository employeeRepository) {
        this.employeeRepository = employeeRepository;
    }

    @Override
    public Employee get() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null || !authentication.isAuthenticated()) {
            return null;
        }
        return employeeRepository.findByLogin(authentication.getName()).orElseGet(() -> null);
    }

}

而我的EmployeeRepository 是:

public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
    Optional<Employee> findByLogin(String login);
}

发生异常时我尝试更新的实体可以是任何具有由 spring 的@CreatedBy 注释的字段的实体。例如:

@Entity
@NoArgsConstructor
@Getter @Setter
public class Issue extends AbstractPersistable<Integer> {

    @CreatedDate
    @Column(nullable = false)
    private LocalDateTime createdAt;

    @CreatedBy
    @ManyToOne(optional = false)
    private Employee createdBy;

    @Column(nullable = true)
    private String body;

}

如果我会为这个实体做:

Issue issue = issueRepository.findOne(1);
issue.setBody("new issue body");
issueRepository.saveAndFlush(issue);

然后异常发生。

我找到了一种解决方法:如果我将@Transactional(propagation = Propagation.REQUIRES_NEW) 添加到我的Employee get() 方法中,那么一切都开始工作了。但是为什么没有它就不行呢?也许弹簧数据中有错误?还是我做错了什么?

【问题讨论】:

  • 你得到什么异常?请在您的帖子中包含所有相关信息,而不是在外部网站上。
  • 我向外部站点发布了异常,因为stackoverflow.com 说我的消息太大。我认为他只是嫉妒,因为我的例外是java.lang.StackOverflowError。 :)
  • 是的,您不应该盲目地发布任何内容,而是将其剥离到相关行。对于 StackOverflowException,通常前 30 - 50 行就足够了。
  • 我一开始是这样做的,但后来我意识到在这种特殊情况下,完整的堆栈跟踪日志很重要。某处存在递归,Spring 开发人员必须查看完整的堆栈跟踪日志才能了解发生了什么。因此,我决定发布完整的日志,而不是仅发布未显示完整图片的部分日志。我清楚地理解 stackoverflow.com 的精神,即在帖子本身中包含尽可能多的相关信息。但是有一个理由不这样做!前 50 行甚至不包括 1 轮递归。
  • 我在帖子中包含了前 100 行堆栈跟踪日志。

标签: spring hibernate spring-mvc spring-data spring-data-jpa


【解决方案1】:

我会从 Spring 上下文中获取当前的审计员,而不是查询它,例如:

@Component
public class SpringSecurityAuditorAware implements AuditorAware<Long> {

    @Override
    public Long getCurrentAuditor() {
        Long userId = 0L;   
        SecurityContext securityContext = SecurityContextHolder.getContext();   
        if ( securityContext.getAuthentication() != null ) {
            User user = (User) securityContext.getAuthentication().getPrincipal();
            userId = Long.valueOf(user.getId()); 
        }
        return userId;
    }

}

【讨论】:

  • 在您的示例中,SmartUser 是实体?在这种情况下,它必须实现它认为的Principal 接口。对于使用 @CreatedBy 注释 getCurrentAuditor() 必须返回实体而不是 id。我知道这种方法,但在我的情况下,实体没有实现Principal。从长远来看,我将重构我的代码,但现在的问题更多是关于递归的错误,我认为它仍然有效。
  • 就我而言,我有 AuditorAware。你可以有别的东西。
猜你喜欢
  • 2011-09-08
  • 2013-09-28
  • 1970-01-01
  • 2016-07-17
  • 2020-04-08
  • 2023-03-06
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多