我需要对以下配置文件进行哪些更改才能让 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)。
最佳答案
以下内容对我有用:
创建一个名为:
aop.xml
的文件META-INF
目录下(与persistence.xml
相同的目录。修改
webApplicationContext.xml
将 Spring 方面 bean 包含在您的emf
中bean 定义(在主项目的src/java/resources
下)。包含相关的
aspectj-maven-plugin
以及您的pom.xml
中的大量依赖项.确保告诉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/