Pergunta

Update 5: Eu fiz o download da última Primavera ToolsSuite IDE baseado na mais recente Eclipse. Quando eu importar o meu projeto como um projeto Maven, Eclipse / STS parece usar os objetivos Maven para construir meu projeto. Este meio AspectJ finalmente funciona corretamente no Eclipse.

Update 4:. I acabaram apenas usando Maven + AspectJ plugin para tecelagem de tempo de compilação, efetivamente ignorando mecanismo de Eclipse

Update 3: Parece plug-in breaks capacidade do Eclipse Eclipse AspectJ para publicar corretamente para Tomcat. Apenas removendo a capacidade AspectJ em um projeto que eu possa obtê-lo para publicar corretamente novamente. Muito chato.

Update 2: eu tenho esse agora trabalhando em Eclipse. Isso me deixa muito desconfortável para dizer isso, mas eu não tenho nenhuma idéia de como eu tenho que trabalhar a partir de qualquer Eclipse ou Maven constrói. Parece ser uma questão de compilação em vez de uma questão de tempo de execução.

Update 1: Parece que eu comecei este para o trabalho via Maven constrói, mas não tenho idéia de como. Eclipse ainda não funciona. A única coisa que mudou no pom.xml foi adicionar estes parâmetros de configuração (insignificantes?):

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

Na verdade, estou preocupado que eu tenho uma repetição do este problema , onde tudo funciona de forma inconsistente. Vou manter esta pergunta atualizado como eu aprender mais.

Com relação ao Eclipse, eu fiz algum progresso, tendo os aspectos binários Desejo tecer - neste caso, primavera-aspects.jar - e copiá-lo para fora do meu classpath. Em seguida, adicione este frasco agora externa à minha Aspecto Path . Após fazer isso, Eclipse mostra corretamente me marcadores AspectJ em meu código. É chato que eu não posso simplesmente deixar primavera-aspects.jar na minha Caminho de Construção Java que é mantido pelo Maven para mim através do Maven plug-in. Por alguma razão, no entanto, o AspectJ plug-in não vê os aspectos binários, a menos que eles estão adicionado explicitamente ao Aspecto Path .


original Pós: @Configurable é uma anotação de mola que permite dependências para ser injectados em objectos instanciado externo de mola (por exemplo, por hibernação ou alguma classe de fábrica)

.

Eu estava usando essa anotação previamente com tecelagem em tempo de carga e principalmente funcionou. Às vezes eu iria arrancar e nada seria injetado. Esta questão gerou esta questão StackOverflow. Não havia muitas respostas, mas a maioria sugeriu que eu tento tempo de compilação de tecelagem em vez devido a uma maior fiabilidade.

I instalado o plug-in para o Eclipse e Maven AspectJ. Ambos estes produtos o que parece ser devidamente compilado classes. Eu abri uma das classes em um editor de texto antes da compilação AspectJ e não encontrou referências a AspectJ. Eu abri-lo após a compilação AspectJ e ambos Eclipse e Maven gerado versões têm uma referência a org.aspectj.weaver.MethodDeclarationLineNumber . É por isso que eu suponho que está a ser devidamente compilados. O problema é que, uma vez implantado, sem dependências se injetado.

Meu Primavera applicationContext.xml não incluem o seguinte:

    <context:spring-configured />

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

É a acima de tudo o que é necessário para as aulas marcadas @Configurable ter DI feito? Durante a conversão de tecelagem em tempo de carga para compilar em tempo de tecelagem, tirei META-INF / aop.xml , do meu applicationContext.xml , e Tomcat da Primavera tecelão do meu context.xml .

Como posso investigar este problema ainda mais? Quais são as possíveis causas?

Foi útil?

Solução

Ele trabalha para nós em maven usando tecelagem tempo de compilação, tente adicionar os seguintes 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>

O seu feito como dois passos de execução separados para permitir que você adicionar diferentes bibliotecas de aspecto para testes de unidade e compilação.

Você também vai precisar do seguinte dependência adicionado para a Primavera-aspectos biblioteca:

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

Outras dicas

configurar com sucesso tecelagem em tempo de carga em meu aplicativo, se esta é uma alternativa para você.

O meu ambiente:

  • JDK-1.6
  • Spring-2.5.6
  • JPA com EclipseLink-1.1.0

Os detalhes de configuração:

configuração XML do Spring:

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

anotações de Primavera

@Configurable("baseEntity")
public abstract class BaseEntity

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

Java VM Parâmetro

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

Instâncias de historyHandler e baseEntitty são criados por ecliselink. historyHandler em baseEntitty e historyDao em historyHandler é definido pela carga-timeweaving.

Você pode definir a VM Parâmetro em configuração de execução Eclipse ou em Tomcats catalina.sh/bat.

tornando um campo de uma classe @configurable Autowired lança NullPointerException se você não configurar sua primavera adequadamente para essa anotação. siga estes passos para fazer anotações @configurable funcionar corretamente

Este método é chamado AspectJ tempo de compilação de tecelagem de grãos de primavera injetar às suas aulas não fez por mola .

O primeiro passo é instalar esses plugins em eclipse:

A partir destes dois sites de atualização instalar qualquer eclipse sugere:

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

Depois de instalar, clique com o botão direito no projeto e fazer:

Configure > Convert to Aspectj
Maven > Update

Em seguida, você precisa adicioná-los para o seu pom.xml:

Sob Dependências Adicionar:

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

Sob Plugins Adicionar:

        <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: NÃO usar qualquer tag <pluginManagment> sob tag <build>. seu pom.xml precisa ser algo como isto:

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

finalmente, adicionar <context:spring-configured /> ao seu arquivo de contexto de configuração aplicação primavera.

Agora você pode anotar uma classe POJO como @Configurable e primavera injetar feijão nele usando anotação @Autowired. Desta forma, sempre que faz uma nova instância da POJO que será configurado (por exemplo, injectado com dependências) automaticamente.

Tanto quanto seus problemas de classpath do Eclipse estão em causa, você pode encontrar este útil.

O m2eclipse plug-in tem um opcional AJDT integração . A integração lê a seção aspectLibraries da configuração do The Maven-aspectj-plugin, e contribui os frascos para Path Aspecto do Eclipse.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top