1

我想使用 JPA EntityListener 来支持 spring 安全 ACL。在@PostPersist事件中,我创建了一个与持久化实体相对应的权限。

我需要这个操作来参与当前的交易。为此,我需要TransactionManagerEntityListener.

问题是,Spring 无法管理它,EntityListener因为它是在EntityManagerFactory实例化时自动创建的。在经典的 Spring 应用程序中,EntityManagerFactory它本身是在TransactioManager实例化期间创建的。

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

所以我没有办法TransactionManager用构造函数注入,因为它还没有被实例化。

使EntityManagera@Component创建 的另一个实例EntityManager。实现 InitiliazingBean 并使用afterPropertySet()不起作用,因为它不是 Spring 托管 bean。

任何想法都会有所帮助,因为我陷入困境并且没有想法。

4

2 回答 2

1

除了 nodje 的指令之外,您还应该添加一件事 - 添加 AnnotationBeanConfigurerAspect 作为实体管理器的依赖项,否则将在初始化 spring 上下文之前创建实体侦听器:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    depends-on="org.springframework.context.config.internalBeanConfigurerAspect">
于 2012-09-20T15:36:09.437 回答
0

一种解决方案是在 EntityListener 上使用 Spring 的 @Configurable 注解。

理论上,它应该允许一个非 Spring 托管实例,在我的例子中为 EntityListener,进行方面编织,从而允许该实例获得 DI。

所以这里是不同的步骤:

  • 将 @Configurable 添加到 EntityListener 并在要注入的字段上添加 @Autowired(此处为 TransactionManager)
  • 添加<context:spring-configured/>到 Spring 上下文
  • 使用 aspect-maven-plugin 进行编译时编织(参见下面的配置)

到目前为止一切顺利,但它对我不起作用。日志说 EntityListerner 是编织的:

[INFO] Extending interface set for type 'org.project.commons.security.DefaultEntityListener' (DefaultEntityListener.java) to include 'org.springframework.beans.factory.aspectj.ConfigurableObject' (AnnotationBeanConfigurerAspect.aj)
[INFO] Join point 'initialization(void org.springframework.beans.factory.aspectj.ConfigurableObject.<init>())' in Type 'org.project.commons.security.DefaultEntityListener' (DefaultEntityListener.java:38) advised by before advice from 'org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect' (spring-aspects-3.1.2.RELEASE.jar!AbstractDependencyInjectionAspect.class:78(from AbstractDependencyInjectionAspect.aj)) [with runtime test]
[INFO] Join point 'initialization(void org.springframework.beans.factory.aspectj.ConfigurableObject.<init>())' in Type 'org.project.commons.security.DefaultEntityListener' (DefaultEntityListener.java:38) advised by afterReturning advice from 'org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect' (spring-aspects-3.1.2.RELEASE.jar!AbstractDependencyInjectionAspect.class:87(from AbstractDependencyInjectionAspect.aj)) [with runtime test]
[INFO] Join point 'initialization(void org.project.commons.security.DefaultEntityListener.<init>())' in Type 'org.project.commons.security.DefaultEntityListener' (DefaultEntityListener.java:38) advised by afterReturning advice from 'org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect' (spring-aspects-3.1.2.RELEASE.jar!AbstractDependencyInjectionAspect.class:87(from AbstractDependencyInjectionAspect.aj)) [with runtime test]

但我从来没有得到预期的注射。

有谁知道的,欢迎指教。。。

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.4</version>
            <configuration>
                <showWeaveInfo>true</showWeaveInfo>
                <proceedOnError>true</proceedOnError>
                <outxml>true</outxml>
                <source>1.6</source>
                <target>1.6</target>
                <complianceLevel>1.6</complianceLevel>
                <encoding>${encoding}</encoding>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-aspects</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
                <weaveDependencies>
                    <weaveDependency>
                        <groupId>org.project</groupId>
                        <artifactId>commons</artifactId>
                    </weaveDependency>
                </weaveDependencies>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <!--<goal>test-compile</goal>-->
                    </goals>
                </execution>
            </executions>
        </plugin>
于 2012-08-22T16:04:13.293 回答