gpt4 book ai didi

spring - hibernate-envers RevisionListener spring 集成为 spring bean

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

我需要在 hibernate-envers 的修订监听器中做一些数据库处理。为此,我需要 Spring Framework 的注入(inject)功能。如何实现?这是表示需要的代码,但 CustomRevisionListener 由 Envers 代码中的构造函数实例化。 Spring 只有 SecurityContextHolder 作为静态服务定位器。如何注入(inject)其他bean?

@Service
public class CustomRevisionListener implements EntityTrackingRevisionListener {

@Resource
private PersistenceManagerHibernate persistenceManagerHibernate;

public void newRevision(Object revisionEntity) {
CustomRevisionEntity revision = (CustomRevisionEntity) revisionEntity;
revision.setUsername(getUsername());
}


public String getUsername() {
final SecurityContext context = SecurityContextHolder.getContext();
if (context != null) {
if (context.getAuthentication() != null) {
return context.getAuthentication().getName();
} else {
return "anonymous";
}
}
return "anonymous";
}

@Override
public void entityChanged(@SuppressWarnings("rawtypes") Class entityClass, String entityName, Serializable entityId, RevisionType revisionType, Object revisionEntity) {
CustomRevisionEntity revision = (CustomRevisionEntity) revisionEntity;
revision.setEntityId(entityId.toString());
revision.setEntityName(entityName);
revision.setRevisionType((int)revisionType.getRepresentation());
Auditable auditable = null;
if (entityId instanceof Long) {
auditable = persistenceManagerHibernate.findById(entityClass, (Long)entityId);
}
revision.setGroupName(auditable.getAuditGroupName());
revision.setGroupEntityId(auditable.getAuditGroupId());
}
}

最佳答案

由于 CustomRevisionListener 是由 Envers 中的构造函数实例化的,因此您必须找到另一种方法来检索 Spring 托管 bean 的句柄。

您可以创建一个实用程序类来实现此目的:

/**
* Utility class which provides lookup services for Spring managed beans from
* within unmanaged beans.
*/
@Component
public class ContextLookup implements ApplicationContextAware {

private static ApplicationContext sApplicationContext;

@Override
public void setApplicationContext( ApplicationContext aApplicationContext )
throws BeansException {
setContext( aApplicationContext );
}

public static void setContext( ApplicationContext aApplicationContext ) {
sApplicationContext = aApplicationContext;
}

protected static ApplicationContext getApplicationContext() {
return sApplicationContext;
}

public static Object getBean( String aName ) {
if ( sApplicationContext != null ) {
return sApplicationContext.getBean( aName );
}
return null;
}

public static <T> T getBean( Class<T> aClass ) {
if ( sApplicationContext != null ) {
return sApplicationContext.getBean( aClass );
}
return null;
}
}

在您的 CustomRevisionListener 中

public class CustomRevisionListener {

public void myMethod() {
..
// get a handle to your spring managed bean
Foo foo = (Foo)ContextLookup.getBean( "mySpringManagedBean" );
..
}

}

关于spring - hibernate-envers RevisionListener spring 集成为 spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8519862/

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