sistema proyectos proyecto medicas hospital historial expediente clinico citas java maven aop spring-aop compile-time-weaving

medicas - proyectos en java netbeans



¿Por qué el diseño en tiempo de compilación de AspectJ del trabajo de @Configurable de AspectJ no funciona? (4)

Actualización 5: he descargado el último IDE de Spring ToolsSuite 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.

Actualización 4: Acabo de utilizar el complemento Maven + AspectJ para el tejido en tiempo de compilación, pasando por alto 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 las compilaciones de Maven, pero no tengo idea de cómo. Eclipse todavía no funciona. Lo único que cambié en el pom.xml fue agregar estos parámetros de configuración (¿insignificantes?):

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

De hecho, me preocupa que repita este problema , donde todo funciona de manera incoherente. Mantendré esta pregunta actualizada mientras aprendo más.

Con respecto a Eclipse, hice algunos progresos al tomar los aspectos binarios que deseo tejer, en este caso spring-aspects.jar , y copiarlos fuera de mi classpath. Luego agrego este jar externo ahora a mi Path de Aspect . Después de hacer esto, Eclipse me muestra correctamente los marcadores AspectJ en mi código. Es molesto que no pueda dejar spring-aspects.jar en mi Java Build Path que Maven mantiene para mí a través del complemento 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 de aspecto .

Publicación original: @Configurable es una anotación de Spring que permite inyectar dependencias en objetos instanciados externos a Spring (por ejemplo, por Hibernate o alguna clase de Factory).

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

Instalé el complemento 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.

My Spring applicationContext.xml incluye lo siguiente:

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

¿Es todo lo que se necesita para que las clases con la etiqueta @Configurable digan DI? Durante la conversión del tejido en tiempo de carga al tejido en tiempo de compilación, eliminé META-INF / aop.xml , <context: load-time-weaver /> de mi applicationContext.xml , y Spring the Tomcat weaver de mi context.xml .

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


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

Mi entorno:

  • JDK-1.6
  • Spring-2.5.6
  • JPA con eclipselink-1.1.0

Detalles de configuración:

Configuración Spring XML:

<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 de primavera

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

Parámetro VM de Java

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

Instancias de historyHandler y baseEntitty son creadas por ecliselink. historyHandler in baseEntitty e historyDao in historyHandler está configurado por load-timeweaving.

Puede configurar el parámetro VM en la configuración de ejecución de Eclipse o en Tomcats catalina.sh/bat.


En lo que respecta a sus problemas de classpath de Eclipse, puede encontrar esto útil.

El complemento m2eclipse tiene una integración AJDT 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.


Nos funciona en maven utilizando el tiempo de compilación, intente agregar los siguientes complementos:

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

Se realiza como dos pasos de ejecución separados para permitirle agregar diferentes bibliotecas de aspecto para la prueba y compilación de unidades.

También necesitará la siguiente dependencia agregada para la biblioteca de aspectos de primavera:

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


haciendo un campo de una clase @configurable Autowired arroja NullPointerException si no configura su resorte correctamente para esta anotación. siga estos pasos para hacer que las anotaciones configurables funcionen correctamente

Este método se llama tejido de tiempo de creación AspectJ tejiendo para inyectar los frijoles primavera a sus clases no hechas en primavera .

El primer paso es instalar estos complementos en eclipse:

De estos dos sitios de actualización, instale cualquier eclipse que sugiera:

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

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

Configure > Convert to Aspectj Maven > Update

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

En Dependencias Agregar:

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

En Complementos, agregue:

<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 use ninguna etiqueta <pluginManagment> debajo de la etiqueta <build> . su pom.xml necesita ser algo como esto:

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

finalmente agregue <context:spring-configured /> a su archivo de configuración de contexto de la aplicación de primavera.

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