在Weblogic 12.2.1上使用带JMS模板的动态代理的Spring AOP时出错
当我尝试在同一个项目中使用Spring模板JMS-to-messaging-to-ActiveMQ和Spring-AOP来审核和处理Weblogic 12.2.1上的异常时,我遇到了一个错误。服务器启动时出错 若我将方面配置为使用CGLIB,那个么我从Weblogic得到了异常,而且我更喜欢,若有可能保持使用动态代理。有没有人已经有过这个问题,或者知道是什么导致了这个问题 我的方面配置类:在Weblogic 12.2.1上使用带JMS模板的动态代理的Spring AOP时出错,spring,spring-aop,spring-jms,spring-amqp,Spring,Spring Aop,Spring Jms,Spring Amqp,当我尝试在同一个项目中使用Spring模板JMS-to-messaging-to-ActiveMQ和Spring-AOP来审核和处理Weblogic 12.2.1上的异常时,我遇到了一个错误。服务器启动时出错 若我将方面配置为使用CGLIB,那个么我从Weblogic得到了异常,而且我更喜欢,若有可能保持使用动态代理。有没有人已经有过这个问题,或者知道是什么导致了这个问题 我的方面配置类: @Configuration @EnableAspectJAutoProxy @lombok.extern
@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;
}
}
@Configuration
@EnableAspectJAutoProxy
@lombok.extern.slf4j.Slf4j
public class AspectConfig {
@Bean
public LoggingErrorAspect loggingErrorAspect(){
return new LoggingErrorAspect();
}
}
@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();
}
}
消息侦听器配置类:
@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;
}
}
@Configuration
@EnableAspectJAutoProxy
@lombok.extern.slf4j.Slf4j
public class AspectConfig {
@Bean
public LoggingErrorAspect loggingErrorAspect(){
return new LoggingErrorAspect();
}
}
@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();
}
}
@配置
@使能JMS
@lombok.extern.slf4j.slf4j
公共类MessagingListenerConfig{
@自动连线
连接工厂连接工厂;
@豆子
公共JmsListenerContainerFactory JmsListenerContainerFactory(){
DefaultJmsListenerContainerFactory=新的DefaultJmsListenerContainerFactory();
工厂。设置连接工厂(连接工厂);
factory.setConcurrency(“1-1”);
返回工厂;
}
}
堆栈:
weblogic.application.ModuleException:
org.springframework.beans.factory.BeanNotOfRequiredTypeException:Bean
命名
'org.springframework.jms.config.internalJmsListenerEndpointRegistry'
应为类型
“org.springframework.jms.config.JmsListenerEndpointRegistry”但是
实际类型为'com.sun.proxy.$Proxy213'
您不显示注入
JmsListenerEndpointRegistry
(或RabbitTemplate
)的位置,但在使用JDK代理进行代理时,必须通过接口注入
你为什么要向注册处提出建议?你想用这些建议达到什么目的?它不提供很多接口,因此一旦代理,它就不能被引用,除非通过DisposableBean
和SmartLifecycle
可以代理
rabbitmplate
,但需要插入RabbitOperations
,而不是rabbitmplate
,我解决了这个问题。我必须将代理更改为AMQP RabbitMQ,并且我需要在所有配置中使用接口而不是类。在它之后,启动负载工作,并且方面也工作
下面是方面配置和消息传递配置
AspectConfig:
@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;
}
}
@Configuration
@EnableAspectJAutoProxy
@lombok.extern.slf4j.Slf4j
public class AspectConfig {
@Bean
public LoggingErrorAspect loggingErrorAspect(){
return new LoggingErrorAspect();
}
}
@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();
}
}
MessagingConfig:
@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;
}
}
@Configuration
@EnableAspectJAutoProxy
@lombok.extern.slf4j.Slf4j
public class AspectConfig {
@Bean
public LoggingErrorAspect loggingErrorAspect(){
return new LoggingErrorAspect();
}
}
@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();
}
}
我试图更改为RabbitMQ,但我遇到了相同的问题:
weblogic.application.ModuleException:org.springframework.beans.factory.BeanNotOfRequiredTypeException:Bean名为“emailRabbitTemplate”的预期类型为“org.springframework.amqp.rabbit.core.RabbitTemplate”,但实际类型为“com.sun.proxy.$Proxy182”
Gary,是否有某种方法可以定义方面,使其仅用于特定类?我使用aspect的主要目标是处理常规异常和审核常规操作。您需要在aspect中添加切入点,以指定应用它的位置。有关@enableAspectProxy
和的,请参阅javadocs。谢谢Gary Russel。我找到了解决办法。