2014-12-16 3 views
1

ниже код правильно не выполнил AspectJAspectJ для АННОТАЦИИ с классами не работает

import org.springframework.context.annotation.ConditionContext; 
import org.springframework.context.annotation.Conditional; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.ConfigurationCondition; 
import org.springframework.context.annotation.ImportResource; 
import org.springframework.core.type.AnnotatedTypeMetadata; 

@Configuration 
@Conditional(ConditionalConfiguration.Condition) 
@ImportResource("/com/example/context-fragment.xml") 
public class ConditionalConfiguration { 
    static class Condition implements ConfigurationCondition { 
     @Override 

     public ConfigurationPhase getConfigurationPhase() { 
      return ConfigurationPhase.PARSE_CONFIGURATION; 
     }   
     @Override 
     public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
      // only load context-fragment.xml if the system property is defined 
      return System.getProperty("com.example.context-fragment") != null; 
     } 
    } 
} 

Я использую Eclipse, AspectJ Tool. и ошибка показана для аннотации @Conditional.

как @Conditional:

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.TYPE, ElementType.METHOD}) 
public @interface Conditional { 

    /** 
    * All {@link Condition}s that must {@linkplain Condition#matches match} 
    * in order for the component to be registered. 
    */ 
    Class<? extends Condition>[] value(); 

} 

Ошибка:

org.aspectj.weaver.BCException 
at org.aspectj.ajdt.internal.core.builder.AjState.recordClassFile(AjState.java:1519) 
at org.aspectj.ajdt.internal.core.builder.AjState.noteResult(AjState.java:1325) 
at org.aspectj.ajdt.internal.core.builder.AjBuildManager$3.acceptResult(AjBuildManager.java:1061) 
at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.afterProcessing(AjPipeliningCompilerAdapter.java:426) 
at org.aspectj.ajdt.intern ... .0_21-64\jre\lib\ext\sunmscapi.jar;E:\jdk1.7.0_21-64\jre\lib\ext\zipfs.jar;D:\eclipse\\plugins/org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar; 

Любая идея, как я могу заставить его работать, или, по крайней мере это путь, который я могу установить Eclipse, AspectJ Tool просто игнорировать этот файл.

+0

Если у вас есть проблема с AspectJ, пожалуйста, разместите аспект (ы). и если это проблема компилятора AspectJ, сообщите нам версию AspectJ, которую вы используете для компиляции (версия плагина AJDT, если вы используете AJDT в Eclipse). Оптимально предоставить воспроизводимый [SSCCE] (http://sscce.org/). – kriegaex

ответ

1

Я просто смог воспроизвести вашу проблему. Ваш код неправильный, а не AspectJ. Измените значение аннотаций, как это:

@Conditional(ConditionalConfiguration.Condition.class) 

Вы просто забыли использовать суффикс .class. Исправьте свой собственный код, тогда компилятор больше не будет жаловаться. ;-)

Update: Потому что ваша ошибка не должна убить компилятор AspectJ в любом случае, я создал bug ticket для него, но факт остается фактом, что ваш собственный код был поддельным.

+0

org.aspectj.weaver.BCException меня вводит в заблуждение! Спасибо за ответ, я нашел выше код на stackovrflow (http://stackoverflow.com/questions/3035630/how-to-achieve-conditional-resource-import-in-a-spring-xml-context), потому что мой проект eclipse был включен аспект. У меня никогда не было возможности увидеть фактическую ошибку компиляции, а не проблему aspectJ. Я собираюсь исправить код там! –

+0

На самом деле это не AspectJ, это компилятор Eclipse, который AspectJ делегирует, который генерирует плохой байтовый код. Потому что, после компиляции, AspectJ сразу захочет вникнуть в этот байт-код, он сразу же преодолевает проблему. Я поднял ошибку затмения (https://bugs.eclipse.org/bugs/show_bug.cgi?id=456960), чтобы установить, какой AspectJ может забрать. Использование регулярного затмения для компиляции того, что образец Java не будет терпеть неудачу, так как Eclipse не сразу проверяет, действительно ли байт-код действителен. Во всяком случае, просто FYI. –

+0

Спасибо Andy за продолжение этой проблемы. С точки зрения пользователя это проблема * Ajc *, потому что средний пользователь AspectJ не заботится и даже не знает, какие компоненты * Ajc * используют внутри. Я, как частый пользователь, все это знаю и понимаю, что вы зависите от других людей, решающих основную причину этой проблемы. В любом случае это не блокиратор, и я рад, что люди компилятора Eclipse знают об этом и исправят его в свое время. :-) – kriegaex

Смежные вопросы