[英]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: 以下对我有用:
Create a file called: aop.xml
under the directory META-INF
(the same directory that holds persistence.xml
. 在
META-INF
目录下创建一个名为: aop.xml
的文件(与persistence.xml
相同的目录)。
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
下)。
Include the relevant aspectj-maven-plugin
and lots of dependencies in your pom.xml
. 在
pom.xml
包含相关的aspectj-maven-plugin
和许多依赖项。
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.