java - 如何使 Spring AspectJ 注释在 Java 6/7 中工作

标签 java spring maven aspectj

我需要对以下配置文件进行哪些更改才能让 Maven 使用 Spring Aspects(带有注释的项目)编译我的 Java 7 项目?

pom.xml
webapplicationContext.xml
etc....

这是我的方面类(它从 TypedQuery.getSingleResult() 捕获 NoResultException 并将其转换为空结果值)

package com.example.aspect;

import javax.persistence.NoResultException;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class NullifyNoResultExceptionAspect {

    @Pointcut("execution(public * com.example.dao.impl.*.*(..))")
    public void methodToBeProtected() {}

    @Around("methodToBeProtected()")
    public Object queryToProtect(ProceedingJoinPoint pjp) throws Throwable {
        try {
            return pjp.proceed();
        } catch (NoResultException nre) {
            return null;
        }
    }

}

我正在使用 Eclipse Juno sr1 和 Java 7 EE。
我的构建环境是带有 Nexus 存储库的 Maven (2)。

最佳答案

以下内容对我有用:

  1. 创建一个名为:aop.xml 的文件META-INF目录下(与 persistence.xml 相同的目录。

  2. 修改webApplicationContext.xml将 Spring 方面 bean 包含在您的 emf 中bean 定义(在主项目的 src/java/resources 下)。

  3. 包含相关的 aspectj-maven-plugin以及您的 pom.xml 中的大量依赖项.

  4. 确保告诉aspectj插件您想要编译Java 7代码,否则它将尝试使用默认的AspectJ-1.6编织器来编织您的1.7代码。

1 - aop.xml

<!DOCTYPE aspectj PUBLIC
        "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>

    <weaver>

        <!-- only weave classes in our application-specific packages -->
        <include within="com.example.*"/>

    </weaver>

    <aspects>

        <!-- weave in just this aspect -->        
        <aspect name="com.example.aspect.NullifyNoResultExceptionAspect"/>

    </aspects>

  </aspectj>

2 - WebApplicationContext.xml
您的 emf bean 应该如下所示:

<bean id="emf"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="za.org.serviceseta.model" />
    <property name="jpaVendorAdapter">
        <bean
            class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="${hibernate.showsql}" />
            <property name="generateDdl" value="${jpa.generateDdl}" />
            <property name="databasePlatform"
                value="org.hibernate.dialect.MySQLDialect" />
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>

    </property>
    <property name="loadTimeWeaver">
        <bean
            class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
</bean>

_请注意,有些教程会告诉您包含 <context:load-time-weaver /> ,但这仅适用于 toplink,不适用于 spring; Spring 想看 bean 。

3 - pom.xml - 第 1 部分:告诉 jetty-maven-plugin使用spring javaagent

<build>
    <plugins>
        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.0.0.M5</version>
            <configuration>
                <forkMode>once</forkMode>
                <argLine>
                     -javaagent:"${settings.localRepository}/org/springframework/spring-instrument/${spring.framework.version}/spring-instrument-${spring.framework.version}.jar"
                </argLine>
....

3 - pom.xml - 第 2 部分:aspectj-maven-plugin

<project>
....
    <properties>
        <aspectj.version>1.7.2</aspectj.version>
        <!-- note that AspectJ warns you that it prefers 1.6.11, but this works -->
        .....

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.4</version>
    <configuration>
        <showWeaveInfo>true</showWeaveInfo>
        <source>1.7</source>     <!-- need these for Java 7! -->
        <target>1.7</target>     <!-- need these for Java 7! -->
        <Xlint>ignore</Xlint>
        <complianceLevel>1.7</complianceLevel>  <!-- need these for Java 7! -->
        <encoding>UTF-8</encoding>
        <verbose>false</verbose>
        <aspectLibraries>
            <aspectLibrary>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
            </aspectLibrary>
        </aspectLibraries>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${aspectj.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjtools</artifactId>
            <version>${aspectj.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>3.2.1.RELEASE</version>
        </dependency>
    </dependencies>
</plugin>

3 - pom.xml 第 3 部分:依赖项

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>${aspectj.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>3.2.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-agent</artifactId>
    <version>2.5.6</version>
</dependency>

如果我遗漏了什么,请随时发表评论。

关于java - 如何使 Spring AspectJ 注释在 Java 6/7 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15118250/

相关文章:

java - 如何创建一个JComboBox,其每个元素都有两种不同的样式?

java - tomcat在spring添加spring data redis依赖后不启动

java - 如何修复 "Exception in thread "main"java.lang.NoClassDefFoundError : com/dropbox/core/json/JsonReader$FileLoadException"

java - Maven maven-assembly-plugin 使用配置文件构建

java - 我的 addbyAge() 函数出了什么问题,导致一个人不知何故失踪?

java - ManagedBean 中的数据不会在 View 中刷新

java - 为什么放置 start() 命令时会有所不同?

java - Spring 框架中错误的请求绑定(bind)对象

java - 在 javascript 中迭代模型映射列表

java - 实例化 org.springframework.beans.propertyeditors.StringTrimmerEditor 的 bean 时出错