9
hibernate-enversのリビジョンリスナーで何らかのデータベース処理を行う必要があります。そのためには、Spring Frameworkの機能が必要です。これはどのように実装できますか?ここに必要性を表すコードがありますが、CustomRevisionListenerはEnversコードのコンストラクタによってインスタンス化されています。 Springには静的サービスロケータとしてSecurityContextHolder
しかありません。他の豆をどのように注入するのですか? CustomRevisionListenerがEnversでコンストラクタでインスタンス化されているのでhibernate-envers Spring BeanとしてのRevisionListener Spring統合
@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());
}
}
おかげで、とてもうまくいきました。 – realcnbs