2017-03-03 14 views
0

同じプロジェクトで使用しようとするとエラーが発生するSpringテンプレートJMSがActiveMQとSpring AOPにメッセージを送信してWeblogic 12.2.1。サーバーの起動時にエラーが発生します。Weblogic上でJMSテンプレートを使用したDynamic ProxyでSpring AOPを使用するとエラーが発生する12.2.1

CGLIBを使用するように設定すると、Weblogicから例外が発生します。これは、Dynamic Proxyの使用を維持することが可能な場合は好きです。誰もがすでにこの問題を抱えていたのですか、それを引き起こす可能性があるのですか?

マイアスペクト設定クラス:

@Configuration 
@EnableAspectJAutoProxy 
@lombok.extern.slf4j.Slf4j 
public class AspectConfig { 

    @Bean 
    public LoggingErrorAspect loggingErrorAspect(){ 
     return new LoggingErrorAspect(); 
    } 
} 

メッセージ・リスナーの設定クラス:

@Configuration 
@EnableJms 
@lombok.extern.slf4j.Slf4j 
public class MessagingListenerConfig { 

    @Autowired 
    ConnectionFactory connectionFactory; 

    @Bean 
    public JmsListenerContainerFactory<?> jmsListenerContainerFactory() { 
     DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); 
     factory.setConnectionFactory(connectionFactory); 
     factory.setConcurrency("1-1"); 
     return factory; 
    } 

} 

スタック:

weblogic.application.ModuleEx ception: org.springframework.beans.factory.BeanNotOfRequiredTypeException: という名前のビーン 'org.springframework.jms.config.internalJmsListenerEndpointRegistry' が 'org.springframework.jms.config.JmsListenerEndpointRegistry' タイプ であることが期待しかし だっれます実際にタイプの「com.sun.proxy。$ Proxy213」

+0

私はRabbitMQのに変更しようとしましたが、私は同じ問題だ: 'weblogic.application.ModuleException:ORGを。 springframework.beans.factory.BeanNotOfRequiredTypeException: 'emailRabbitTemplate'という名前のBeanは 'org.springframework.amqp.rabbit.core.Ra'型であると予想されます。実際にタイプ 'com.sun.proxy。$ Proxy182'' – antoniolazaro

答えて

0

あなたがJmsListenerEndpointRegistry(またはRabbitTemplate)を注入されている場合あなたは表示されませんが、JDKプロキシとプロキシ際インタフェースにより注入することがあります。

なぜレジストリにアドバイスしているのですか?これで何を達成しようとしていますか?多くのインターフェイスを提供しないので、一度プロキシされることはできません。DisposableBeanSmartLifecycle以外は参照できません。

RabbitTemplateはプロキシできますが、RabbitOperationsではなくRabbitTemplateを注入する必要があります。

+0

でした。ゲイリー、特定のクラスで動作するようにアスペクトを定義する方法はありますか?アスペクトを使用する主なターゲットは、一般的な例外を処理し、一般的な操作を監査することです。 – antoniolazaro

+0

アスペクトにポイントカットを追加して、適用する場所を指定する必要があります。@ EnableAspectJAutoProxy'と[Spring Reference Manual](http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/aop.html)のjavadocを参照してください。 –

+0

ありがとう、ゲイリー・ラッセル。私は解決策を見つけた。 – antoniolazaro

0

問題を修正しました。私はブローカーをAMQP RabbitMQに変更しなければなりませんでした。私はすべての設定でクラスの代わりにインターフェイスを使用する必要がありました。その後、スタートアップの読み込みとアスペクトも機能します。

ここには、Aspect ConfigとMessaging Configがあります。

AspectConfig:

@Configuration 
@EnableAspectJAutoProxy 
@lombok.extern.slf4j.Slf4j 
public class AspectConfig { 

    @Bean 
    public LoggingErrorAspect loggingErrorAspect(){ 
     return new LoggingErrorAspect(); 
    } 
} 

MessagingConfig:

@Configuration 
@PropertySources({ @PropertySource("classpath:/config/messaging.properties") }) 
@ComponentScan("br.com.aegea.scab.notification") 
@lombok.extern.slf4j.Slf4j 
public class MessagingConfig { 

    public static final String ERROR_QUEUE = "ERROR_QUEUE"; 
    public static final String EMAIL_QUEUE = "EMAIL_QUEUE"; 

    @Autowired 
    private Environment environment; 

    @Bean 
    public ConnectionFactory connectionFactory() { 
     CachingConnectionFactory connectionFactory = new CachingConnectionFactory(environment.getProperty("spring.rabbitMQ.host")); 
     connectionFactory.setUsername(environment.getProperty("spring.rabbitMQ.user")); 
     connectionFactory.setPassword(environment.getProperty("spring.rabbitMQ.password")); 
     return connectionFactory; 
    } 

    @Bean 
    public MessageConverter jsonMessageConverter() { 
     return new JsonMessageConverter(); 
    } 

    @Bean 
    public RabbitOperations emailRabbitTemplate() { 
     RabbitTemplate template = new RabbitTemplate(connectionFactory()); 
     template.setRoutingKey(EMAIL_QUEUE); 
     template.setMessageConverter(jsonMessageConverter()); 
     return template; 
    } 

    @Bean 
    public MessageListenerContainer listenerContainer() { 
     SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer(); 
     listenerContainer.setConnectionFactory(connectionFactory()); 
     listenerContainer.setQueueNames(EMAIL_QUEUE); 
     listenerContainer.setMessageConverter(jsonMessageConverter()); 
     listenerContainer.setMessageListener(messageReceiver()); 
     listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO); 
     return listenerContainer; 
    } 

    @Bean 
    public MessageListener messageReceiver() { 
     return new MessageReceiver(); 
    } 
} 
関連する問題