Инъекция на основе ткачества во время компиляции не работает

Я уже некоторое время использую переплетение во время компиляции, чтобы добавить некоторые компоненты Spring в Hibernate Search FieldBridge:

@Configurable 
public class MultiLingualClassBridge implements FieldBridge,ParameterizedBridge { 

@Inject 
MessageSource messages; 

Кажется, что аспект сплетен правильно (я декомпилировал класс для проверки), однако во время выполнения MessageSource не вводится.

<plugin>
           <groupId>org.codehaus.mojo</groupId> 
            <artifactId>aspectj-maven-plugin</artifactId> 
            <version>1.4</version> 

            <executions> 
                <execution> 
                    <phase>process-classes</phase> 
                    <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> 
            </dependencies> 
            <configuration> 
                <source>1.6</source> 
                <target>1.6</target> 
                <verbose>true</verbose> 
                <complianceLevel>1.6</complianceLevel> 
                <encoding>UTF-8</encoding> 
                <showWeaveInfo>true</showWeaveInfo> 
                <forceAjcCompile>true</forceAjcCompile> 
                <aspectLibraries> 
                    <aspectLibrary> 
                        <groupId>org.springframework</groupId> 
                        <artifactId>spring-aspects</artifactId> 
                    </aspectLibrary> 
                </aspectLibraries> 
                <weaveDirectories> 
                    <weaveDirectory>${project.build.directory}/unwoven-classes</weaveDirectory> 
                </weaveDirectories> 

            </configuration> 

        </plugin>  

Я работаю с Spring 3.1.2, Hibernate 4.2.2 и Hibernate Search 4.3.0. Я обновил аспектj с 1.6.11 до 1.7.2 безрезультатно. Понижение спящего режима, похоже, не повлияло. То же самое происходит на Tomcat 6 и 7.

<context:spring-configured /> 

<context:annotation-config/> 

<context:component-scan 
    base-package="nl.project"/>  

Декомпилированный класс (пробовал переключиться на внедрение setMethod)

    @Configurable
    public class MultiLingualClassBridge
      implements FieldBridge, ParameterizedBridge, ConfigurableObject
    {
      MessageSource messages;

      static
      {
        ajc$preClinit();
      }

      public MultiLingualClassBridge()
      {
        JoinPoint localJoinPoint2 = Factory.makeJP(ajc$tjp_1, this, this); JoinPoint localJoinPoint1 = Factory.makeJP(ajc$tjp_0, this, this); if ((this != null) && (getClass().isAnnotationPresent(Configurable.class)) && (AnnotationBeanConfigurerAspect.ajc$if$bb0((Configurable)getClass().getAnnotation(Configurable.class)))) AnnotationBeanConfigurerAspect.aspectOf().ajc$before$org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect$1$e854fa65(this); if ((this != null) && (getClass().isAnnotationPresent(Configurable.class)) && ((this == null) || (!getClass().isAnnotationPresent(Configurable.class)) || (!AnnotationBeanConfigurerAspect.ajc$if$bb0((Configurable)getClass().getAnnotation(Configurable.class)))) && (AbstractDependencyInjectionAspect.ajc$if$6f1(localJoinPoint1))) AnnotationBeanConfigurerAspect.aspectOf().ajc$afterReturning$org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect$2$1ea6722c(this);


        if ((!AnnotationBeanConfigurerAspect.ajc$if$bb0((Configurable)getClass().getAnnotation(Configurable.class))) && (AbstractDependencyInjectionAspect.ajc$if$6f1(localJoinPoint2))) AnnotationBeanConfigurerAspect.aspectOf().ajc$afterReturning$org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect$2$1ea6722c(this);
      }

      @Inject
      public void setMessages(MessageSource messages)
      {
        this.messages = messages;
        log.info("MessageSource successfully registered");
      }

Я перепробовал множество вещей, но теперь у меня закончились идеи, как заставить это работать. Какие-либо предложения?

С уважением, Марк


person Marc    schedule 18.06.2013    source источник
comment
Вы говорите, что когда-то он работал, но после некоторых обновлений он перестал работать или никогда не работал?   -  person Hardy    schedule 19.06.2013
comment
Вы видели этот вопрос - stackoverflow.com/questions/901632/? Кажется, та же проблема. Вы сравнивали конфигурацию вашего плагина с той, что была в сообщении?   -  person Hardy    schedule 19.06.2013
comment
И каково ваше поведение прямо сейчас? Возникает ли исключение? Можете ли вы заставить инъекцию работать для другого класса?   -  person Hardy    schedule 19.06.2013
comment
Это сработало. к сожалению, из-за того, что этот аспект не работает, точка отката не ясна. Исключения не возникает, MessageSource просто не установлен. Я вижу, что компиляция работает нормально. Я отредактировал свой пост декомпилированным материалом aop   -  person Marc    schedule 19.06.2013
comment
Я предполагаю, что, возможно, придется что-то делать с проблемами загрузки классов, поскольку я использую это в контексте проекта, который содержит часть Spring MVC и основную часть бизнес-логики, частью которой является этот класс. Есть идеи о том, что отлаживать, чтобы получить больше информации?   -  person Marc    schedule 19.06.2013
comment
Хм, обычно проблема с загрузкой класса вызывает какое-то исключение. Отладка расширенных классов, конечно, также сложна, потому что ваша IDE видит разные классы. Я бы попытался найти код Spring, который отвечает за инъекцию. Не уверен, какой именно, но там вы сможете увидеть, что происходит.   -  person Hardy    schedule 21.06.2013
comment
Хм, ну я нашел причину, если не основную причину. Фактически аспект находится и обрабатывается. Но когда AnnotationBeanConfigurerAspect пытается настроить bean-компонент, beanFactory по-прежнему имеет значение null. Непонятно почему.   -  person Marc    schedule 03.07.2013
comment
Фактически, я вижу, что вызов setBeanFactory в org.springframework.beans.factory.wiring.BeanConfigurerSupport происходит после выполнения configureBean при запуске моста классов Hibernate. Как это исправить?   -  person Marc    schedule 03.07.2013


Ответы (1)


Кажется, это помогает

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="org.springframework.context.config.internalBeanConfigurerAspect">
person Marc    schedule 03.07.2013