2013-02-27 93 views
0

我需要對下面的配置文件做些什麼改動才能讓Maven用Spring Aspects(帶註釋的那個)編譯我的Java 7項目?如何使Spring AspectJ註釋在Java中工作6/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朱諾SR1和Java EE 7。
我的構建環境是帶有Nexus存儲庫的Maven(2)。

+0

你的配置在java 6中有效嗎? – eis 2013-02-27 17:39:08

+0

不,我有一個Java 7項目,我只是詳細介紹了設置以備將來參考。 – Johan 2013-02-27 17:48:18

回答

2

以下爲我工作:

  1. 創建一個名爲:目錄META-INF(同樣持有persistence.xml目錄下aop.xml

  2. 修改webApplicationContext.xml包括在Spring方面豆你emf豆的定義(在主項目中src/java/resources

  3. 包括rele和pom.xml很多依賴關係。

  4. 請務必告訴您想要編譯Java 7代碼的aspectj插件,否則它會嘗試使用默認的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 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,不適用於春天;春天想看豆子。

3 - 的pom.xml - 第1部分:告訴jetty-maven-plugin使用彈簧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> 

如果我遺漏了任何東西,請隨時發表評論。

+0

所以這是相同的設置爲Java 6,除了aspectj-maven-plugin配置具有'1.7'條目? – eis 2013-02-27 18:04:42

+0

是的,它應該是,但也許你需要將'$ {aspectj.version}'降級到'1.6.11'。 – Johan 2013-02-27 18:19:52