简体   繁体   English

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

[英]How to make Spring AspectJ annotations work in Java 6/7

What changes do I need to make to the below config files to get maven to compile my Java 7 project with Spring Aspects (the one with annotations)? 我需要对下面的配置文件做些什么更改才能让maven用Spring Aspects(带注释的那个)编译我的Java 7项目?

pom.xml
webapplicationContext.xml
etc....

Here's my aspect class (it catches the NoResultException from TypedQuery.getSingleResult() and transforms it into a null result value) 这是我的方面类(它从TypedQuery.getSingleResult()捕获NoResultException并将其转换为null结果值)

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;
        }
    }

}

I'm using Eclipse Juno sr1 and Java 7 EE. 我正在使用Eclipse Juno sr1和Java 7 EE。
My build environment is Maven (2) with a Nexus repository. 我的构建环境是带有Nexus存储库的Maven(2)。

The following worked for me: 以下对我有用:

  1. Create a file called: aop.xml under the directory META-INF (the same directory that holds persistence.xml . META-INF目录下创建一个名为: aop.xml的文件(与persistence.xml相同的目录)。

  2. Modify webApplicationContext.xml to include the Spring aspect bean in your emf bean definition (under src/java/resources in the main project). 修改webApplicationContext.xml以在您的emf bean定义中包含Spring方面bean(在主项目中的src/java/resources下)。

  3. Include the relevant aspectj-maven-plugin and lots of dependencies in your pom.xml . pom.xml包含相关的aspectj-maven-plugin和许多依赖项。

  4. Make sure to tell the aspectj plugin that you want to compile Java 7 code, or it will try to weave your 1.7 code using the default AspectJ-1.6 weaver. 确保告诉aspectj插件您要编译Java 7代码,否则它将尝试使用默认的AspectJ-1.6编织器编织1.7代码。

1 - aop.xml 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 2 - WebApplicationContext.xml
Your emf bean should look something like this: 你的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>

_Note that some tutorials tell you to include <context:load-time-weaver /> , but that only works for toplink, not for spring; _注意一些教程告诉你包含<context:load-time-weaver /> ,但这只适用于toplink,而不适用于spring; Spring want to see beans. 春天想看豆子。

3 - pom.xml - part 1: tell jetty-maven-plugin to use the spring javaagent 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 - part 2: the aspectj-maven-plugin 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 part 3: dependencies 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>

If I've left anything out, feel free to comment. 如果我遗漏了任何内容,请随时发表评论。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM