2009-05-23 10 views
25

Actualización 5: He descargado el último Spring ToolsSuite IDE basado en el último Eclipse. Cuando importo mi proyecto como proyecto de Maven, parece que Eclipse/STS usa los objetivos de Maven para construir mi proyecto. Esto significa que AspectJ finalmente funciona correctamente en Eclipse.¿Por qué el diseño en tiempo de compilación AspectJ del trabajo @Configurable de Spring?

Actualización 4: He terminado utilizando el plugin Maven + AspectJ para el tejido en tiempo de compilación, eludiendo de manera efectiva el mecanismo de Eclipse.

Actualización 3: Parece que el complemento Eclipse de AspectJ rompe la capacidad de Eclipse para publicar correctamente en Tomcat. Solo eliminando la capacidad de AspectJ en un proyecto, puedo volver a publicarlo correctamente. Muy molesto.

Actualización 2: Tengo esto ahora trabajando en Eclipse. Me resulta muy incómodo decir esto, pero no tengo idea de cómo lo conseguí trabajando desde las versiones de Eclipse o Maven. Parece ser un problema de compilación en lugar de un problema de tiempo de ejecución.

Actualización 1: Parece que he conseguido que esto funcione a través de compilaciones Maven, pero no tengo idea de cómo. Eclipse todavía no funciona. Lo único que ha cambiado en el pom.xml estaba añadiendo estos parámetros de configuración (no significativos?):

<source>1.6</source> 
<complianceLevel>1.6</complianceLevel> 
<verbose>true</verbose> 
<showWeaveInfo>true</showWeaveInfo> 
<outxml>true</outxml> 

estoy realmente preocupado de que tengo una repetición de this problem, donde todo funciona de manera inconsistente. Mantendré esta pregunta actualizada mientras aprendo más.

Con respecto a Eclipse, hice algunos progresos tomando los aspectos binarios que deseo tejer - en este caso spring-aspects.jar - y copiándolo fuera de mi classpath. Luego agrego este jar externo ahora a mi Aspect Path. Después de hacer esto, Eclipse me muestra correctamente los marcadores AspectJ en mi código. Es molesto que no puedo simplemente dejar spring-aspects.jar en mi ruta de compilación de Java que es mantenida por Maven para mí a través del plug-in Maven. Sin embargo, por algún motivo, el complemento AspectJ no ve los aspectos binarios a menos que se agreguen explícitamente a la ruta Aspect Path.


Post original: @Configurable es una anotación de resorte que permite a las dependencias que se inyecta en los objetos instanciados externa a la primavera (por ejemplo, mediante Hibernate o alguna clase de fábrica).

Estaba usando esta anotación anteriormente con el tejido en tiempo de carga y en su mayoría trabajado. De vez en cuando, arrancaba y nada se inyectaba. Este problema engendró this StackOverflow question. No hubo muchas respuestas, pero la mayoría sugirió que intente tejer en tiempo de compilación debido a una mayor fiabilidad.

Instalé el plug-in AspectJ para Eclipse y Maven. Ambos producen lo que parecen ser clases compiladas correctamente. Abrí una de las clases en un editor de texto antes de la compilación de AspectJ y no encontré referencias a AspectJ. Lo abrí después de la compilación de AspectJ y las versiones generadas de Eclipse y Maven tienen una referencia a org.aspectj.weaver.MethodDeclarationLineNumber. Es por eso que supongo que está siendo compilado correctamente.El problema es que una vez desplegado, no se inyectan dependencias.

Mi Primavera applicationContext.xml no se incluyen los siguientes:

<context:spring-configured /> 

    <context:component-scan base-package="com.myapp" /> 

¿El por encima de todo lo que se necesita para las clases marcadas @Configurable haber hecho DI? Durante la conversión de la carga en tiempo tejiendo a tiempo de compilación tejer, quité META-INF/aop.xml, < contexto: en tiempo de carga-tejedor /> de mi applicationContext.xml y tejedora Tomcat de primavera desde mi context.xml.

¿Cómo puedo investigar más este problema? ¿Cuáles son las posibles causas?

Respuesta

26

Funciona para nosotros en experta utilizando compilar tejer tiempo, trate de añadir los siguientes plugins:

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-compiler-plugin</artifactId> 
<configuration> 
    <compilerVersion>1.6</compilerVersion> 
    <fork>true</fork> 
    <source>1.6</source> 
    <target>1.6</target> 
</configuration> 
</plugin> 

<plugin> 
<groupId>org.codehaus.mojo</groupId> 
<artifactId>aspectj-maven-plugin</artifactId> 
<executions> 
    <execution> 
     <id>compile</id> 
     <configuration> 
      <source>1.6</source> 
      <target>1.6</target> 
      <verbose>false</verbose> 
      <outxml>true</outxml> 
      <aspectLibraries> 
       <aspectLibrary> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-aspects</artifactId> 
       </aspectLibrary> 
      </aspectLibraries> 
     </configuration> 
     <goals> 
      <goal>compile</goal> 
     </goals> 
    </execution> 
    <execution> 
     <id>test-compile</id> 
     <configuration> 
      <source>1.6</source> 
      <target>1.6</target> 
      <verbose>false</verbose> 
      <aspectLibraries> 
       <aspectLibrary> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-aspects</artifactId> 
       </aspectLibrary> 
      </aspectLibraries> 
     </configuration> 
     <goals> 
      <goal>test-compile</goal> 
     </goals> 
    </execution> 
</executions> 
<dependencies> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
     <version>1.6.4</version> 
    </dependency> 
</dependencies> 
</plugin> 

Su hecho como dos pasos de ejecución independientes que le permiten agregar diferentes bibliotecas de aspecto para las pruebas unitarias y compilación.

también necesitará la siguiente dependencia añadido para la biblioteca de primavera-aspectos:

<dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aspects</artifactId> 
     <scope>compile</scope> 
    </dependency> 
+3

necesita agregar 1.6 a la configuración aspectj-maven-plugin, de lo contrario termina con un error (configure.incompatibleComplianceForSource) según mensaje de error probablemente porque complianceLevel es por defecto 1.4 y difiere de la configuración de origen que es 1.6 en su caso –

+0

después de aplicar este consejo me enfrenté con el problema de que mis pruebas no funcionan porque se invocan los aspectos aspecto y el aspecto interior no existen campos inicializados, así veo NPE – gstackoverflow

7

Configuré satisfactoriamente el tejido en tiempo de carga en mi aplicación, si esta es una alternativa para usted.

Mi entorno:

  • JDK 1.6-
  • Primavera-2.5.6
  • JPA con EclipseLink 1.1.0-

detalles de configuración: configuración XML

primavera :

<context:annotation-config/> 
<context:spring-configured/> 
<context:load-time-weaver/> 

<bean id="baseEntity" class="package.name.BaseEntity" scope="prototype"> 
    <property name="historyHandler" ref="historyHandler" /> 
</bean> 

<bean id="historyHandler" class="package.name.HistoryJpaHandler" scope="prototype"> 
    <property name="historyDao" ref="historyDao" /> 
</bean> 

<bean id="historyDao" class="package.name.HistoryJpaDao"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

anotaciones Spring

@Configurable("baseEntity") 
public abstract class BaseEntity 

@Configurable("historyHandler") 
public class HistoryJpaHandler extends SessionEventAdapter implements HistoryHandler 

Java VM parámetros

<JAVA_HOME>/bin/java -javaagent:/full/path/to/spring-agent-2.5.6.jar 

Las instancias de historyHandler y baseEntitty son creados por ecliselink. historyHandler in baseEntitty e historyDao in historyHandler está configurado por load-timeweaving.

Puede establecer el parámetro de máquina virtual en la configuración de ejecución de Eclipse o en catalca.sh/bat de Tomcats.

2

En cuanto a sus problemas de rutas de clases de Eclipse se refiere, es posible encontrar esto útil.

El m2eclipse plugin tiene un AJDT integration opcional. La integración lee la sección aspectLibraries de la configuración de aspectj-maven-plugin y contribuye con los jar a la ruta de aspecto de Eclipse.

4

haciendo un campo de una clase @configurable Autowired arroja NullPointerException si no configura su resorte correctamente para esta anotación. siga estos pasos para realizar anotaciones @configurable funcionan correctamente

Este método se llama AspectJ construir el tiempo tejiendo para inyectar granos de primavera a sus clases no por resorte hecho.

primer paso es instalar estos plugins de Eclipse:

A partir de estos dos sitios de actualización instalar cualquier Eclipse sugiere:

http://download.eclipse.org/tools/ajdt/43/update 
http://dist.springsource.org/release/AJDT/configurator/ 

Después de la instalación, haga clic en proyecto y Do:

Configure > Convert to Aspectj 
Maven > Update 

A continuación, debe agregarlos a su pom.xml:

en Dependencias Añadir:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aspects</artifactId> 
    <version>4.0.2.RELEASE</version> 
</dependency> 

Bajo plugins Añadir:

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.5</version> 
      <configuration> 
       <showWeaveInfo>true</showWeaveInfo> 
       <source>1.7</source> 
       <target>1.7</target> 
       <Xlint>ignore</Xlint> 
       <complianceLevel>1.7</complianceLevel> 
       <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>1.7.0</version> 
       </dependency> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjtools</artifactId> 
        <version>1.7.0</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

Importante: no uso ninguna etiqueta <pluginManagment> bajo <build> etiqueta. su pom.xml tiene que ser algo como esto:

<project ....> 
    .... 
    <dependencies> 
     <dependency> 
        .... 
     </dependency> 
       .... 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
          .... 
      </plugin> 
         .... 
     </plugins> 
    </build> 
</project> 

por último añadir <context:spring-configured /> a su archivo de configuración de contexto de aplicación de primavera.

Ahora puede anotar una clase POJO como @Configurable e inyectar los granos de primavera con la anotación @Autowired. De esta forma, cada vez que realice una nueva instancia de ese POJO, se configurará (por ejemplo, se inyectarán dependencias) automáticamente.

Cuestiones relacionadas