JmsListener/ScheduledAnnotationBeanPostProcessor uses SmartInitializingSingleton instead of ContextRefreshedEvent

Also reducing the container dependencies to BeanFactory instead of ApplicationContext, wherever possible.

Issue: SPR-12039
This commit is contained in:
Juergen Hoeller 2014-07-28 15:58:13 +02:00
parent b6389a6c66
commit 92c657e12d
10 changed files with 272 additions and 281 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2013 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -23,13 +23,14 @@ import java.util.TimeZone;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import org.springframework.aop.support.AopUtils; import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationListener;
import org.springframework.context.EmbeddedValueResolverAware; import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.TaskScheduler;
@ -57,7 +58,7 @@ import org.springframework.util.StringValueResolver;
* <p>Auto-detects any {@link SchedulingConfigurer} instances in the container, * <p>Auto-detects any {@link SchedulingConfigurer} instances in the container,
* allowing for customization of the scheduler to be used or for fine-grained control * allowing for customization of the scheduler to be used or for fine-grained control
* over task registration (e.g. registration of {@link Trigger} tasks. * over task registration (e.g. registration of {@link Trigger} tasks.
* See @{@link EnableScheduling} Javadoc for complete usage details. * See the @{@link EnableScheduling} javadocs for complete usage details.
* *
* @author Mark Fisher * @author Mark Fisher
* @author Juergen Hoeller * @author Juergen Hoeller
@ -70,18 +71,23 @@ import org.springframework.util.StringValueResolver;
* @see org.springframework.scheduling.config.ScheduledTaskRegistrar * @see org.springframework.scheduling.config.ScheduledTaskRegistrar
*/ */
public class ScheduledAnnotationBeanPostProcessor public class ScheduledAnnotationBeanPostProcessor
implements BeanPostProcessor, Ordered, EmbeddedValueResolverAware, ApplicationContextAware, implements BeanPostProcessor, Ordered, EmbeddedValueResolverAware, BeanFactoryAware,
ApplicationListener<ContextRefreshedEvent>, DisposableBean { SmartInitializingSingleton, DisposableBean {
private Object scheduler; private Object scheduler;
private StringValueResolver embeddedValueResolver; private StringValueResolver embeddedValueResolver;
private ApplicationContext applicationContext; private ListableBeanFactory beanFactory;
private final ScheduledTaskRegistrar registrar = new ScheduledTaskRegistrar(); private final ScheduledTaskRegistrar registrar = new ScheduledTaskRegistrar();
@Override
public int getOrder() {
return LOWEST_PRECEDENCE;
}
/** /**
* Set the {@link org.springframework.scheduling.TaskScheduler} that will invoke * Set the {@link org.springframework.scheduling.TaskScheduler} that will invoke
* the scheduled methods, or a {@link java.util.concurrent.ScheduledExecutorService} * the scheduled methods, or a {@link java.util.concurrent.ScheduledExecutorService}
@ -96,16 +102,63 @@ public class ScheduledAnnotationBeanPostProcessor
this.embeddedValueResolver = resolver; this.embeddedValueResolver = resolver;
} }
/**
* Making a {@link BeanFactory} available is optional; if not set,
* {@link SchedulingConfigurer} beans won't get autodetected and
* a {@link #setScheduler scheduler} has to be explicitly configured.
*/
@Override @Override
public void setApplicationContext(ApplicationContext applicationContext) { public void setBeanFactory(BeanFactory beanFactory) {
this.applicationContext = applicationContext; this.beanFactory = (beanFactory instanceof ListableBeanFactory ? (ListableBeanFactory) beanFactory : null);
} }
@Override /**
public int getOrder() { * @deprecated as of Spring 4.1, in favor of {@link #setBeanFactory}
return LOWEST_PRECEDENCE; */
@Deprecated
public void setApplicationContext(ApplicationContext applicationContext) {
this.beanFactory = applicationContext;
} }
@Override
public void afterSingletonsInstantiated() {
if (this.scheduler != null) {
this.registrar.setScheduler(this.scheduler);
}
if (this.beanFactory != null) {
Map<String, SchedulingConfigurer> configurers = this.beanFactory.getBeansOfType(SchedulingConfigurer.class);
for (SchedulingConfigurer configurer : configurers.values()) {
configurer.configureTasks(this.registrar);
}
}
if (this.registrar.hasTasks() && this.registrar.getScheduler() == null) {
Assert.state(this.beanFactory != null, "BeanFactory must be set to find scheduler by type");
Map<String, ? super Object> schedulers = new HashMap<String, Object>();
schedulers.putAll(this.beanFactory.getBeansOfType(TaskScheduler.class));
schedulers.putAll(this.beanFactory.getBeansOfType(ScheduledExecutorService.class));
if (schedulers.size() == 0) {
// do nothing -> fall back to default scheduler
}
else if (schedulers.size() == 1) {
this.registrar.setScheduler(schedulers.values().iterator().next());
}
else if (schedulers.size() >= 2){
throw new IllegalStateException(
"More than one TaskScheduler and/or ScheduledExecutorService " +
"exist within the context. Remove all but one of the beans; or " +
"implement the SchedulingConfigurer interface and call " +
"ScheduledTaskRegistrar#setScheduler explicitly within the " +
"configureTasks() callback. Found the following beans: " + schedulers.keySet());
}
}
this.registrar.afterPropertiesSet();
}
@Override @Override
public Object postProcessBeforeInitialization(Object bean, String beanName) { public Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean; return bean;
@ -254,44 +307,6 @@ public class ScheduledAnnotationBeanPostProcessor
} }
} }
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (event.getApplicationContext() != this.applicationContext) {
return;
}
if (this.scheduler != null) {
this.registrar.setScheduler(this.scheduler);
}
Map<String, SchedulingConfigurer> configurers =
this.applicationContext.getBeansOfType(SchedulingConfigurer.class);
for (SchedulingConfigurer configurer : configurers.values()) {
configurer.configureTasks(this.registrar);
}
if (this.registrar.hasTasks() && this.registrar.getScheduler() == null) {
Map<String, ? super Object> schedulers = new HashMap<String, Object>();
schedulers.putAll(this.applicationContext.getBeansOfType(TaskScheduler.class));
schedulers.putAll(this.applicationContext.getBeansOfType(ScheduledExecutorService.class));
if (schedulers.size() == 0) {
// do nothing -> fall back to default scheduler
}
else if (schedulers.size() == 1) {
this.registrar.setScheduler(schedulers.values().iterator().next());
}
else if (schedulers.size() >= 2){
throw new IllegalStateException(
"More than one TaskScheduler and/or ScheduledExecutorService " +
"exist within the context. Remove all but one of the beans; or " +
"implement the SchedulingConfigurer interface and call " +
"ScheduledTaskRegistrar#setScheduler explicitly within the " +
"configureTasks() callback. Found the following beans: " + schedulers.keySet());
}
}
this.registrar.afterPropertiesSet();
}
@Override @Override
public void destroy() { public void destroy() {

View File

@ -22,14 +22,14 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.springframework.aop.support.AopUtils; import org.springframework.aop.support.AopUtils;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanInitializationException; import org.springframework.beans.factory.BeanInitializationException;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.AnnotationConfigUtils; import org.springframework.context.annotation.AnnotationConfigUtils;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.jms.config.DefaultJmsHandlerMethodFactory; import org.springframework.jms.config.DefaultJmsHandlerMethodFactory;
@ -39,6 +39,7 @@ import org.springframework.jms.config.JmsListenerEndpointRegistrar;
import org.springframework.jms.config.JmsListenerEndpointRegistry; import org.springframework.jms.config.JmsListenerEndpointRegistry;
import org.springframework.jms.config.MethodJmsListenerEndpoint; import org.springframework.jms.config.MethodJmsListenerEndpoint;
import org.springframework.messaging.handler.invocation.InvocableHandlerMethod; import org.springframework.messaging.handler.invocation.InvocableHandlerMethod;
import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -60,6 +61,7 @@ import org.springframework.util.StringUtils;
* {@link EnableJms} Javadoc for complete usage details. * {@link EnableJms} Javadoc for complete usage details.
* *
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Juergen Hoeller
* @since 4.1 * @since 4.1
* @see JmsListener * @see JmsListener
* @see EnableJms * @see EnableJms
@ -69,11 +71,11 @@ import org.springframework.util.StringUtils;
* @see org.springframework.jms.config.AbstractJmsListenerEndpoint * @see org.springframework.jms.config.AbstractJmsListenerEndpoint
* @see MethodJmsListenerEndpoint * @see MethodJmsListenerEndpoint
*/ */
public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor, Ordered, public class JmsListenerAnnotationBeanPostProcessor
ApplicationContextAware, ApplicationListener<ContextRefreshedEvent> { implements BeanPostProcessor, Ordered, BeanFactoryAware, SmartInitializingSingleton {
/** /**
* The bean name of the default {@link JmsListenerContainerFactory} * The bean name of the default {@link JmsListenerContainerFactory}.
*/ */
static final String DEFAULT_JMS_LISTENER_CONTAINER_FACTORY_BEAN_NAME = "jmsListenerContainerFactory"; static final String DEFAULT_JMS_LISTENER_CONTAINER_FACTORY_BEAN_NAME = "jmsListenerContainerFactory";
@ -82,9 +84,9 @@ public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor
private String containerFactoryBeanName = DEFAULT_JMS_LISTENER_CONTAINER_FACTORY_BEAN_NAME; private String containerFactoryBeanName = DEFAULT_JMS_LISTENER_CONTAINER_FACTORY_BEAN_NAME;
private final JmsHandlerMethodFactoryAdapter jmsHandlerMethodFactory = new JmsHandlerMethodFactoryAdapter(); private BeanFactory beanFactory;
private ApplicationContext applicationContext; private final JmsHandlerMethodFactoryAdapter jmsHandlerMethodFactory = new JmsHandlerMethodFactoryAdapter();
private final JmsListenerEndpointRegistrar registrar = new JmsListenerEndpointRegistrar(); private final JmsListenerEndpointRegistrar registrar = new JmsListenerEndpointRegistrar();
@ -124,9 +126,50 @@ public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor
this.jmsHandlerMethodFactory.setJmsHandlerMethodFactory(jmsHandlerMethodFactory); this.jmsHandlerMethodFactory.setJmsHandlerMethodFactory(jmsHandlerMethodFactory);
} }
/**
* Making a {@link BeanFactory} available is optional; if not set,
* {@link JmsListenerConfigurer} beans won't get autodetected and an
* {@link #setEndpointRegistry endpoint registry} has to be explicitly configured.
*/
@Override @Override
public void setApplicationContext(ApplicationContext applicationContext) { public void setBeanFactory(BeanFactory beanFactory) {
this.applicationContext = applicationContext; this.beanFactory = beanFactory;
}
@Override
public void afterSingletonsInstantiated() {
this.registrar.setBeanFactory(this.beanFactory);
if (this.beanFactory instanceof ListableBeanFactory) {
Map<String, JmsListenerConfigurer> instances =
((ListableBeanFactory) this.beanFactory).getBeansOfType(JmsListenerConfigurer.class);
for (JmsListenerConfigurer configurer : instances.values()) {
configurer.configureJmsListeners(this.registrar);
}
}
if (this.registrar.getEndpointRegistry() == null) {
if (this.endpointRegistry == null) {
Assert.state(this.beanFactory != null, "BeanFactory must be set to find endpoint registry by bean name");
this.endpointRegistry = this.beanFactory.getBean(
AnnotationConfigUtils.JMS_LISTENER_ENDPOINT_REGISTRY_BEAN_NAME, JmsListenerEndpointRegistry.class);
}
this.registrar.setEndpointRegistry(this.endpointRegistry);
}
if (this.containerFactoryBeanName != null) {
this.registrar.setContainerFactoryBeanName(this.containerFactoryBeanName);
}
// Set the custom handler method factory once resolved by the configurer
JmsHandlerMethodFactory handlerMethodFactory = this.registrar.getJmsHandlerMethodFactory();
if (handlerMethodFactory != null) {
this.jmsHandlerMethodFactory.setJmsHandlerMethodFactory(handlerMethodFactory);
}
// Actually register all listeners
this.registrar.afterPropertiesSet();
} }
@ -189,8 +232,9 @@ public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor
JmsListenerContainerFactory<?> factory = null; JmsListenerContainerFactory<?> factory = null;
String containerFactoryBeanName = jmsListener.containerFactory(); String containerFactoryBeanName = jmsListener.containerFactory();
if (StringUtils.hasText(containerFactoryBeanName)) { if (StringUtils.hasText(containerFactoryBeanName)) {
Assert.state(this.beanFactory != null, "BeanFactory must be set to obtain container factory by bean name");
try { try {
factory = this.applicationContext.getBean(containerFactoryBeanName, JmsListenerContainerFactory.class); factory = this.beanFactory.getBean(containerFactoryBeanName, JmsListenerContainerFactory.class);
} }
catch (NoSuchBeanDefinitionException ex) { catch (NoSuchBeanDefinitionException ex) {
throw new BeanInitializationException("Could not register jms listener endpoint on [" + throw new BeanInitializationException("Could not register jms listener endpoint on [" +
@ -199,49 +243,7 @@ public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor
} }
} }
registrar.registerEndpoint(endpoint, factory); this.registrar.registerEndpoint(endpoint, factory);
}
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (event.getApplicationContext() != this.applicationContext) {
return;
}
Map<String, JmsListenerConfigurer> instances =
this.applicationContext.getBeansOfType(JmsListenerConfigurer.class);
for (JmsListenerConfigurer configurer : instances.values()) {
configurer.configureJmsListeners(registrar);
}
this.registrar.setApplicationContext(this.applicationContext);
if (this.registrar.getEndpointRegistry() == null) {
if (this.endpointRegistry == null) {
this.endpointRegistry = this.applicationContext.getBean(
AnnotationConfigUtils.JMS_LISTENER_ENDPOINT_REGISTRY_BEAN_NAME, JmsListenerEndpointRegistry.class);
}
this.registrar.setEndpointRegistry(this.endpointRegistry);
}
if (this.containerFactoryBeanName != null) {
this.registrar.setContainerFactoryBeanName(this.containerFactoryBeanName);
}
// Set the custom handler method factory once resolved by the configurer
JmsHandlerMethodFactory handlerMethodFactory = registrar.getJmsHandlerMethodFactory();
if (handlerMethodFactory != null) {
this.jmsHandlerMethodFactory.setJmsHandlerMethodFactory(handlerMethodFactory);
}
// Create all the listeners and starts them
try {
this.registrar.afterPropertiesSet();
}
catch (Exception ex) {
throw new BeanInitializationException("Failed to initialize JmsListenerEndpointRegistrar", ex);
}
} }
private String getEndpointId(JmsListener jmsListener) { private String getEndpointId(JmsListener jmsListener) {
@ -282,7 +284,7 @@ public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor
private JmsHandlerMethodFactory createDefaultJmsHandlerMethodFactory() { private JmsHandlerMethodFactory createDefaultJmsHandlerMethodFactory() {
DefaultJmsHandlerMethodFactory defaultFactory = new DefaultJmsHandlerMethodFactory(); DefaultJmsHandlerMethodFactory defaultFactory = new DefaultJmsHandlerMethodFactory();
defaultFactory.setApplicationContext(applicationContext); defaultFactory.setBeanFactory(beanFactory);
defaultFactory.afterPropertiesSet(); defaultFactory.afterPropertiesSet();
return defaultFactory; return defaultFactory;
} }

View File

@ -20,11 +20,10 @@ import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.ConversionService;
import org.springframework.format.support.DefaultFormattingConversionService; import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.messaging.converter.GenericMessageConverter; import org.springframework.messaging.converter.GenericMessageConverter;
@ -36,8 +35,6 @@ import org.springframework.messaging.handler.annotation.support.PayloadArgumentR
import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver; import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver;
import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite; import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite;
import org.springframework.messaging.handler.invocation.InvocableHandlerMethod; import org.springframework.messaging.handler.invocation.InvocableHandlerMethod;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.validation.Errors; import org.springframework.validation.Errors;
import org.springframework.validation.Validator; import org.springframework.validation.Validator;
@ -57,15 +54,13 @@ import org.springframework.validation.Validator;
* can be converted * can be converted
* *
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Juergen Hoeller
* @since 4.1 * @since 4.1
* @see #setCustomArgumentResolvers(java.util.List) * @see #setConversionService
* @see #setValidator(Validator) * @see #setValidator
* @see #setConversionService(ConversionService) * @see #setCustomArgumentResolvers
*/ */
public class DefaultJmsHandlerMethodFactory public class DefaultJmsHandlerMethodFactory implements JmsHandlerMethodFactory, BeanFactoryAware, InitializingBean {
implements JmsHandlerMethodFactory, InitializingBean, ApplicationContextAware {
private ApplicationContext applicationContext;
private ConversionService conversionService = new DefaultFormattingConversionService(); private ConversionService conversionService = new DefaultFormattingConversionService();
@ -73,22 +68,17 @@ public class DefaultJmsHandlerMethodFactory
private Validator validator = new NoOpValidator(); private Validator validator = new NoOpValidator();
private List<HandlerMethodArgumentResolver> customArgumentResolvers private List<HandlerMethodArgumentResolver> customArgumentResolvers;
= new ArrayList<HandlerMethodArgumentResolver>();
private HandlerMethodArgumentResolverComposite argumentResolvers private final HandlerMethodArgumentResolverComposite argumentResolvers =
= new HandlerMethodArgumentResolverComposite(); new HandlerMethodArgumentResolverComposite();
private BeanFactory beanFactory;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
/** /**
* Set the {@link ConversionService} to use to convert the original * Set the {@link ConversionService} to use to convert the original
* message payload or headers. * message payload or headers.
*
* @see HeaderMethodArgumentResolver * @see HeaderMethodArgumentResolver
* @see GenericMessageConverter * @see GenericMessageConverter
*/ */
@ -96,24 +86,15 @@ public class DefaultJmsHandlerMethodFactory
this.conversionService = conversionService; this.conversionService = conversionService;
} }
protected ConversionService getConversionService() {
return conversionService;
}
/** /**
* Set the {@link MessageConverter} to use. By default a {@link GenericMessageConverter} * Set the {@link MessageConverter} to use. By default a {@link GenericMessageConverter}
* is used. * is used.
*
* @see GenericMessageConverter * @see GenericMessageConverter
*/ */
public void setMessageConverter(MessageConverter messageConverter) { public void setMessageConverter(MessageConverter messageConverter) {
this.messageConverter = messageConverter; this.messageConverter = messageConverter;
} }
protected MessageConverter getMessageConverter() {
return messageConverter;
}
/** /**
* Set the Validator instance used for validating @Payload arguments * Set the Validator instance used for validating @Payload arguments
* @see org.springframework.validation.annotation.Validated * @see org.springframework.validation.annotation.Validated
@ -123,27 +104,15 @@ public class DefaultJmsHandlerMethodFactory
this.validator = validator; this.validator = validator;
} }
/**
* The configured Validator instance
*/
public Validator getValidator() {
return validator;
}
/** /**
* Set the list of custom {@code HandlerMethodArgumentResolver}s that will be used * Set the list of custom {@code HandlerMethodArgumentResolver}s that will be used
* after resolvers for supported argument type. * after resolvers for supported argument type.
* @param customArgumentResolvers the list of resolvers; never {@code null}. * @param customArgumentResolvers the list of resolvers (never {@code null})
*/ */
public void setCustomArgumentResolvers(List<HandlerMethodArgumentResolver> customArgumentResolvers) { public void setCustomArgumentResolvers(List<HandlerMethodArgumentResolver> customArgumentResolvers) {
Assert.notNull(customArgumentResolvers, "The 'customArgumentResolvers' cannot be null.");
this.customArgumentResolvers = customArgumentResolvers; this.customArgumentResolvers = customArgumentResolvers;
} }
public List<HandlerMethodArgumentResolver> getCustomArgumentResolvers() {
return customArgumentResolvers;
}
/** /**
* Configure the complete list of supported argument types effectively overriding * Configure the complete list of supported argument types effectively overriding
* the ones configured by default. This is an advanced option. For most use cases * the ones configured by default. This is an advanced option. For most use cases
@ -157,20 +126,26 @@ public class DefaultJmsHandlerMethodFactory
this.argumentResolvers.addResolvers(argumentResolvers); this.argumentResolvers.addResolvers(argumentResolvers);
} }
public List<HandlerMethodArgumentResolver> getArgumentResolvers() { /**
return this.argumentResolvers.getResolvers(); * A {@link BeanFactory} only needs to be available for placeholder resolution
* in handler method arguments; it's optional otherwise.
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
} }
@Override @Override
public void afterPropertiesSet() { public void afterPropertiesSet() {
if (messageConverter == null) { if (this.messageConverter == null) {
messageConverter = new GenericMessageConverter(getConversionService()); this.messageConverter = new GenericMessageConverter(this.conversionService);
} }
if (this.argumentResolvers.getResolvers().isEmpty()) { if (this.argumentResolvers.getResolvers().isEmpty()) {
this.argumentResolvers.addResolvers(initArgumentResolvers()); this.argumentResolvers.addResolvers(initArgumentResolvers());
} }
} }
@Override @Override
public InvocableHandlerMethod createInvocableHandlerMethod(Object bean, Method method) { public InvocableHandlerMethod createInvocableHandlerMethod(Object bean, Method method) {
InvocableHandlerMethod handlerMethod = new InvocableHandlerMethod(bean, method); InvocableHandlerMethod handlerMethod = new InvocableHandlerMethod(bean, method);
@ -179,27 +154,28 @@ public class DefaultJmsHandlerMethodFactory
} }
protected List<HandlerMethodArgumentResolver> initArgumentResolvers() { protected List<HandlerMethodArgumentResolver> initArgumentResolvers() {
ConfigurableBeanFactory beanFactory =
(ClassUtils.isAssignableValue(ConfigurableApplicationContext.class, applicationContext)) ?
((ConfigurableApplicationContext) applicationContext).getBeanFactory() : null;
List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>(); List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>();
ConfigurableBeanFactory cbf = (this.beanFactory instanceof ConfigurableBeanFactory ?
(ConfigurableBeanFactory) this.beanFactory : null);
// Annotation-based argument resolution // Annotation-based argument resolution
resolvers.add(new HeaderMethodArgumentResolver(getConversionService(), beanFactory)); resolvers.add(new HeaderMethodArgumentResolver(this.conversionService, cbf));
resolvers.add(new HeadersMethodArgumentResolver()); resolvers.add(new HeadersMethodArgumentResolver());
// Type-based argument resolution // Type-based argument resolution
resolvers.add(new MessageMethodArgumentResolver()); resolvers.add(new MessageMethodArgumentResolver());
resolvers.addAll(getCustomArgumentResolvers()); if (this.customArgumentResolvers != null) {
resolvers.add(new PayloadArgumentResolver(getMessageConverter(), getValidator())); resolvers.addAll(this.customArgumentResolvers);
}
resolvers.add(new PayloadArgumentResolver(this.messageConverter, this.validator));
return resolvers; return resolvers;
} }
private static final class NoOpValidator implements Validator { private static final class NoOpValidator implements Validator {
@Override @Override
public boolean supports(Class<?> clazz) { public boolean supports(Class<?> clazz) {
return false; return false;

View File

@ -19,9 +19,9 @@ package org.springframework.jms.config;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
@ -29,24 +29,26 @@ import org.springframework.util.Assert;
* a {@link JmsListenerEndpointRegistry}. * a {@link JmsListenerEndpointRegistry}.
* *
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Juergen Hoeller
* @since 4.1 * @since 4.1
* @see org.springframework.jms.annotation.JmsListenerConfigurer * @see org.springframework.jms.annotation.JmsListenerConfigurer
*/ */
public class JmsListenerEndpointRegistrar implements ApplicationContextAware, InitializingBean { public class JmsListenerEndpointRegistrar implements BeanFactoryAware, InitializingBean {
private JmsListenerEndpointRegistry endpointRegistry; private JmsListenerEndpointRegistry endpointRegistry;
private String containerFactoryBeanName; private JmsHandlerMethodFactory jmsHandlerMethodFactory;
private JmsListenerContainerFactory<?> containerFactory; private JmsListenerContainerFactory<?> containerFactory;
private JmsHandlerMethodFactory jmsHandlerMethodFactory; private String containerFactoryBeanName;
private ApplicationContext applicationContext; private BeanFactory beanFactory;
private final List<JmsListenerEndpointDescriptor> endpointDescriptors = private final List<JmsListenerEndpointDescriptor> endpointDescriptors =
new ArrayList<JmsListenerEndpointDescriptor>(); new ArrayList<JmsListenerEndpointDescriptor>();
/** /**
* Set the {@link JmsListenerEndpointRegistry} instance to use. * Set the {@link JmsListenerEndpointRegistry} instance to use.
*/ */
@ -59,27 +61,7 @@ public class JmsListenerEndpointRegistrar implements ApplicationContextAware, In
* registrar, may be {@code null}. * registrar, may be {@code null}.
*/ */
public JmsListenerEndpointRegistry getEndpointRegistry() { public JmsListenerEndpointRegistry getEndpointRegistry() {
return endpointRegistry; return this.endpointRegistry;
}
/**
* Set the bean name of the {@link JmsListenerContainerFactory} to use in
* case a {@link JmsListenerEndpoint} is registered with a {@code null}
* container factory. Alternatively, the container factory instance can
* be registered directly, see {@link #setContainerFactory(JmsListenerContainerFactory)}
*/
public void setContainerFactoryBeanName(String containerFactoryBeanName) {
this.containerFactoryBeanName = containerFactoryBeanName;
}
/**
* Set the {@link JmsListenerContainerFactory} to use in case a {@link JmsListenerEndpoint}
* is registered with a {@code null} container factory.
* <p>Alternatively, the bean name of the {@link JmsListenerContainerFactory} to use
* can be specified for a lazy lookup, see {@link #setContainerFactoryBeanName}.
*/
public void setContainerFactory(JmsListenerContainerFactory<?> containerFactory) {
this.containerFactory = containerFactory;
} }
/** /**
@ -98,12 +80,69 @@ public class JmsListenerEndpointRegistrar implements ApplicationContextAware, In
* Return the custom {@link JmsHandlerMethodFactory} to use, if any. * Return the custom {@link JmsHandlerMethodFactory} to use, if any.
*/ */
public JmsHandlerMethodFactory getJmsHandlerMethodFactory() { public JmsHandlerMethodFactory getJmsHandlerMethodFactory() {
return jmsHandlerMethodFactory; return this.jmsHandlerMethodFactory;
} }
/**
* Set the {@link JmsListenerContainerFactory} to use in case a {@link JmsListenerEndpoint}
* is registered with a {@code null} container factory.
* <p>Alternatively, the bean name of the {@link JmsListenerContainerFactory} to use
* can be specified for a lazy lookup, see {@link #setContainerFactoryBeanName}.
*/
public void setContainerFactory(JmsListenerContainerFactory<?> containerFactory) {
this.containerFactory = containerFactory;
}
/**
* Set the bean name of the {@link JmsListenerContainerFactory} to use in case
* a {@link JmsListenerEndpoint} is registered with a {@code null} container factory.
* Alternatively, the container factory instance can be registered directly:
* see {@link #setContainerFactory(JmsListenerContainerFactory)}.
* @see #setBeanFactory
*/
public void setContainerFactoryBeanName(String containerFactoryBeanName) {
this.containerFactoryBeanName = containerFactoryBeanName;
}
/**
* A {@link BeanFactory} only needs to be available in conjunction with
* {@link #setContainerFactoryBeanName}.
*/
@Override @Override
public void setApplicationContext(ApplicationContext applicationContext) { public void setBeanFactory(BeanFactory beanFactory) {
this.applicationContext = applicationContext; this.beanFactory = beanFactory;
}
@Override
public void afterPropertiesSet() {
registerAllEndpoints();
}
protected void registerAllEndpoints() {
for (JmsListenerEndpointDescriptor descriptor : this.endpointDescriptors) {
this.endpointRegistry.registerListenerContainer(descriptor.endpoint, resolveContainerFactory(descriptor));
}
}
private JmsListenerContainerFactory<?> resolveContainerFactory(JmsListenerEndpointDescriptor descriptor) {
if (descriptor.containerFactory != null) {
return descriptor.containerFactory;
}
else if (this.containerFactory != null) {
return this.containerFactory;
}
else if (this.containerFactoryBeanName != null) {
Assert.state(this.beanFactory != null, "BeanFactory must be set to obtain container factory by bean name");
this.containerFactory = this.beanFactory.getBean(
this.containerFactoryBeanName, JmsListenerContainerFactory.class);
return this.containerFactory; // Consider changing this if live change of the factory is required
}
else {
throw new IllegalStateException("Could not resolve the " +
JmsListenerContainerFactory.class.getSimpleName() + " to use for [" +
descriptor.endpoint + "] no factory was given and no default is set.");
}
} }
/** /**
@ -129,38 +168,6 @@ public class JmsListenerEndpointRegistrar implements ApplicationContextAware, In
registerEndpoint(endpoint, null); registerEndpoint(endpoint, null);
} }
@Override
public void afterPropertiesSet() throws Exception {
Assert.notNull(applicationContext, "ApplicationContext must not be null");
startAllEndpoints();
}
protected void startAllEndpoints() throws Exception {
for (JmsListenerEndpointDescriptor descriptor : endpointDescriptors) {
endpointRegistry.registerListenerContainer(
descriptor.endpoint, resolveContainerFactory(descriptor));
}
}
private JmsListenerContainerFactory<?> resolveContainerFactory(JmsListenerEndpointDescriptor descriptor) {
if (descriptor.containerFactory != null) {
return descriptor.containerFactory;
}
else if (this.containerFactory != null) {
return this.containerFactory;
}
else if (this.containerFactoryBeanName != null) {
this.containerFactory = this.applicationContext.getBean(
this.containerFactoryBeanName, JmsListenerContainerFactory.class);
return this.containerFactory; // Consider changing this if live change of the factory is required
}
else {
throw new IllegalStateException("Could not resolve the " +
JmsListenerContainerFactory.class.getSimpleName() + " to use for [" +
descriptor.endpoint + "] no factory was given and no default is set.");
}
}
private static class JmsListenerEndpointDescriptor { private static class JmsListenerEndpointDescriptor {

View File

@ -40,6 +40,7 @@ import static org.junit.Assert.*;
/** /**
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Juergen Hoeller
*/ */
public class JmsListenerAnnotationBeanPostProcessorTests { public class JmsListenerAnnotationBeanPostProcessorTests {
@ -62,9 +63,7 @@ public class JmsListenerAnnotationBeanPostProcessorTests {
methodEndpoint.setupListenerContainer(listenerContainer); methodEndpoint.setupListenerContainer(listenerContainer);
assertNotNull(listenerContainer.getMessageListener()); assertNotNull(listenerContainer.getMessageListener());
context.start();
assertTrue("Should have been started " + container, container.isStarted()); assertTrue("Should have been started " + container, container.isStarted());
context.close(); // Close and stop the listeners context.close(); // Close and stop the listeners
assertTrue("Should have been stopped " + container, container.isStopped()); assertTrue("Should have been stopped " + container, container.isStopped());
} }

View File

@ -16,8 +16,6 @@
package org.springframework.jms.config; package org.springframework.jms.config;
import static org.junit.Assert.*;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -31,7 +29,7 @@ import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
import org.junit.rules.TestName; import org.junit.rules.TestName;
import org.springframework.context.support.StaticApplicationContext; import org.springframework.beans.factory.support.StaticListableBeanFactory;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.support.GenericConversionService; import org.springframework.core.convert.support.GenericConversionService;
@ -44,8 +42,9 @@ import org.springframework.messaging.handler.invocation.InvocableHandlerMethod;
import org.springframework.messaging.support.MessageBuilder; import org.springframework.messaging.support.MessageBuilder;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
import static org.junit.Assert.*;
/** /**
*
* @author Stephane Nicoll * @author Stephane Nicoll
*/ */
public class DefaultJmsHandlerMethodFactoryTests { public class DefaultJmsHandlerMethodFactoryTests {
@ -160,15 +159,13 @@ public class DefaultJmsHandlerMethodFactoryTests {
private DefaultJmsHandlerMethodFactory createInstance() { private DefaultJmsHandlerMethodFactory createInstance() {
DefaultJmsHandlerMethodFactory factory = new DefaultJmsHandlerMethodFactory(); DefaultJmsHandlerMethodFactory factory = new DefaultJmsHandlerMethodFactory();
factory.setApplicationContext(new StaticApplicationContext()); factory.setBeanFactory(new StaticListableBeanFactory());
return factory; return factory;
} }
private Method getListenerMethod(String methodName, Class<?>... parameterTypes) { private Method getListenerMethod(String methodName, Class<?>... parameterTypes) {
Method method = ReflectionUtils.findMethod(SampleBean.class, Method method = ReflectionUtils.findMethod(SampleBean.class, methodName, parameterTypes);
methodName, parameterTypes); assertNotNull("no method found with name " + methodName + " and parameters " + Arrays.toString(parameterTypes));
assertNotNull("no method found with name " + methodName
+ " and parameters " + Arrays.toString(parameterTypes));
return method; return method;
} }
@ -187,6 +184,7 @@ public class DefaultJmsHandlerMethodFactoryTests {
} }
} }
static class CustomHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { static class CustomHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override @Override

View File

@ -16,14 +16,10 @@
package org.springframework.jms.config; package org.springframework.jms.config;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.jms.JMSException; import javax.jms.JMSException;
import javax.jms.Message; import javax.jms.Message;
import javax.jms.MessageListener; import javax.jms.MessageListener;
@ -33,7 +29,7 @@ import javax.jms.TextMessage;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.context.support.StaticApplicationContext; import org.springframework.beans.factory.support.StaticListableBeanFactory;
import org.springframework.jms.StubTextMessage; import org.springframework.jms.StubTextMessage;
import org.springframework.jms.listener.DefaultMessageListenerContainer; import org.springframework.jms.listener.DefaultMessageListenerContainer;
import org.springframework.jms.listener.SessionAwareMessageListener; import org.springframework.jms.listener.SessionAwareMessageListener;
@ -42,8 +38,10 @@ import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.messaging.handler.annotation.Payload; import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
/** /**
*
* @author Stephane Nicoll * @author Stephane Nicoll
*/ */
public class JmsListenerContainerFactoryIntegrationTests { public class JmsListenerContainerFactoryIntegrationTests {
@ -54,6 +52,7 @@ public class JmsListenerContainerFactoryIntegrationTests {
private final JmsEndpointSampleBean sample = new JmsEndpointSampleBean(); private final JmsEndpointSampleBean sample = new JmsEndpointSampleBean();
@Before @Before
public void setup() { public void setup() {
initializeFactory(factory); initializeFactory(factory);
@ -70,16 +69,6 @@ public class JmsListenerContainerFactoryIntegrationTests {
assertListenerMethodInvocation("expectFooBarUpperCase"); assertListenerMethodInvocation("expectFooBarUpperCase");
} }
static class JmsEndpointSampleBean {
private final Map<String, Boolean> invocations = new HashMap<String, Boolean>();
public void expectFooBarUpperCase(@Payload String msg) {
invocations.put("expectFooBarUpperCase", true);
assertEquals("Unexpected payload message", "FOO-BAR", msg);
}
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private void invokeListener(JmsListenerEndpoint endpoint, Message message) throws JMSException { private void invokeListener(JmsListenerEndpoint endpoint, Message message) throws JMSException {
DefaultMessageListenerContainer messageListenerContainer = DefaultMessageListenerContainer messageListenerContainer =
@ -112,21 +101,31 @@ public class JmsListenerContainerFactoryIntegrationTests {
} }
private Method getListenerMethod(String methodName, Class<?>... parameterTypes) { private Method getListenerMethod(String methodName, Class<?>... parameterTypes) {
Method method = ReflectionUtils.findMethod(JmsEndpointSampleBean.class, Method method = ReflectionUtils.findMethod(JmsEndpointSampleBean.class, methodName, parameterTypes);
methodName, parameterTypes); assertNotNull("no method found with name " + methodName + " and parameters " + Arrays.toString(parameterTypes));
assertNotNull("no method found with name " + methodName
+ " and parameters " + Arrays.toString(parameterTypes));
return method; return method;
} }
private void initializeFactory(DefaultJmsHandlerMethodFactory factory) { private void initializeFactory(DefaultJmsHandlerMethodFactory factory) {
factory.setApplicationContext(new StaticApplicationContext()); factory.setBeanFactory(new StaticListableBeanFactory());
factory.afterPropertiesSet(); factory.afterPropertiesSet();
} }
static class JmsEndpointSampleBean {
private final Map<String, Boolean> invocations = new HashMap<String, Boolean>();
public void expectFooBarUpperCase(@Payload String msg) {
invocations.put("expectFooBarUpperCase", true);
assertEquals("Unexpected payload message", "FOO-BAR", msg);
}
}
private static class UpperCaseMessageConverter implements MessageConverter { private static class UpperCaseMessageConverter implements MessageConverter {
@Override @Override
public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException { public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
return new StubTextMessage(object.toString().toUpperCase()); return new StubTextMessage(object.toString().toUpperCase());
@ -138,6 +137,5 @@ public class JmsListenerContainerFactoryIntegrationTests {
return content.toUpperCase(); return content.toUpperCase();
} }
} }
} }

View File

@ -16,17 +16,16 @@
package org.springframework.jms.config; package org.springframework.jms.config;
import static org.junit.Assert.*;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
import org.springframework.context.support.StaticApplicationContext; import org.springframework.beans.factory.support.StaticListableBeanFactory;
import static org.junit.Assert.*;
/** /**
*
* @author Stephane Nicoll * @author Stephane Nicoll
*/ */
public class JmsListenerEndpointRegistrarTests { public class JmsListenerEndpointRegistrarTests {
@ -40,10 +39,11 @@ public class JmsListenerEndpointRegistrarTests {
private final JmsListenerContainerTestFactory containerFactory = new JmsListenerContainerTestFactory(); private final JmsListenerContainerTestFactory containerFactory = new JmsListenerContainerTestFactory();
@Before @Before
public void setup() { public void setup() {
registrar.setEndpointRegistry(registry); registrar.setEndpointRegistry(registry);
registrar.setApplicationContext(new StaticApplicationContext()); registrar.setBeanFactory(new StaticListableBeanFactory());
} }
@Test @Test

View File

@ -16,16 +16,11 @@
package org.springframework.jms.config; package org.springframework.jms.config;
import static org.junit.Assert.*;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.*;
import java.io.Serializable; import java.io.Serializable;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.jms.Destination; import javax.jms.Destination;
import javax.jms.InvalidDestinationException; import javax.jms.InvalidDestinationException;
import javax.jms.JMSException; import javax.jms.JMSException;
@ -41,16 +36,16 @@ import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
import org.junit.rules.TestName; import org.junit.rules.TestName;
import org.springframework.context.support.StaticApplicationContext; import org.springframework.beans.factory.support.StaticListableBeanFactory;
import org.springframework.jms.StubTextMessage; import org.springframework.jms.StubTextMessage;
import org.springframework.jms.listener.DefaultMessageListenerContainer; import org.springframework.jms.listener.DefaultMessageListenerContainer;
import org.springframework.jms.listener.MessageListenerContainer; import org.springframework.jms.listener.MessageListenerContainer;
import org.springframework.jms.listener.SimpleMessageListenerContainer; import org.springframework.jms.listener.SimpleMessageListenerContainer;
import org.springframework.jms.listener.adapter.ReplyFailureException;
import org.springframework.jms.listener.adapter.ListenerExecutionFailedException; import org.springframework.jms.listener.adapter.ListenerExecutionFailedException;
import org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter; import org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter;
import org.springframework.jms.support.JmsMessageHeaderAccessor; import org.springframework.jms.listener.adapter.ReplyFailureException;
import org.springframework.jms.support.JmsHeaders; import org.springframework.jms.support.JmsHeaders;
import org.springframework.jms.support.JmsMessageHeaderAccessor;
import org.springframework.jms.support.destination.DestinationResolver; import org.springframework.jms.support.destination.DestinationResolver;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.MessageHeaders;
@ -65,8 +60,12 @@ import org.springframework.validation.Errors;
import org.springframework.validation.Validator; import org.springframework.validation.Validator;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import static org.junit.Assert.*;
import static org.mockito.BDDMockito.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
/** /**
*
* @author Stephane Nicoll * @author Stephane Nicoll
*/ */
public class MethodJmsListenerEndpointTests { public class MethodJmsListenerEndpointTests {
@ -83,6 +82,7 @@ public class MethodJmsListenerEndpointTests {
private final JmsEndpointSampleBean sample = new JmsEndpointSampleBean(); private final JmsEndpointSampleBean sample = new JmsEndpointSampleBean();
@Before @Before
public void setup() { public void setup() {
initializeFactory(factory); initializeFactory(factory);
@ -375,10 +375,8 @@ public class MethodJmsListenerEndpointTests {
} }
private Method getListenerMethod(String methodName, Class<?>... parameterTypes) { private Method getListenerMethod(String methodName, Class<?>... parameterTypes) {
Method method = ReflectionUtils.findMethod(JmsEndpointSampleBean.class, Method method = ReflectionUtils.findMethod(JmsEndpointSampleBean.class, methodName, parameterTypes);
methodName, parameterTypes); assertNotNull("no method found with name " + methodName + " and parameters " + Arrays.toString(parameterTypes));
assertNotNull("no method found with name " + methodName
+ " and parameters " + Arrays.toString(parameterTypes));
return method; return method;
} }
@ -395,12 +393,11 @@ public class MethodJmsListenerEndpointTests {
} }
private void initializeFactory(DefaultJmsHandlerMethodFactory factory) { private void initializeFactory(DefaultJmsHandlerMethodFactory factory) {
factory.setApplicationContext(new StaticApplicationContext()); factory.setBeanFactory(new StaticListableBeanFactory());
factory.afterPropertiesSet(); factory.afterPropertiesSet();
} }
private Validator testValidator(final String invalidValue) { private Validator testValidator(final String invalidValue) {
return new Validator() { return new Validator() {
@Override @Override
public boolean supports(Class<?> clazz) { public boolean supports(Class<?> clazz) {
@ -520,11 +517,11 @@ public class MethodJmsListenerEndpointTests {
} }
@SuppressWarnings("serial") @SuppressWarnings("serial")
static class MyBean implements Serializable { static class MyBean implements Serializable {
private String name; private String name;
} }
} }

View File

@ -25,7 +25,7 @@ import javax.jms.TextMessage;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.context.support.StaticApplicationContext; import org.springframework.beans.factory.support.StaticListableBeanFactory;
import org.springframework.jms.StubTextMessage; import org.springframework.jms.StubTextMessage;
import org.springframework.jms.config.DefaultJmsHandlerMethodFactory; import org.springframework.jms.config.DefaultJmsHandlerMethodFactory;
import org.springframework.jms.support.JmsHeaders; import org.springframework.jms.support.JmsHeaders;
@ -38,7 +38,6 @@ import static org.junit.Assert.*;
import static org.mockito.BDDMockito.*; import static org.mockito.BDDMockito.*;
/** /**
*
* @author Stephane Nicoll * @author Stephane Nicoll
*/ */
public class MessagingMessageListenerAdapterTests { public class MessagingMessageListenerAdapterTests {
@ -124,7 +123,7 @@ public class MessagingMessageListenerAdapterTests {
} }
private void initializeFactory(DefaultJmsHandlerMethodFactory factory) { private void initializeFactory(DefaultJmsHandlerMethodFactory factory) {
factory.setApplicationContext(new StaticApplicationContext()); factory.setBeanFactory(new StaticListableBeanFactory());
factory.afterPropertiesSet(); factory.afterPropertiesSet();
} }