2016-04-06 2 views
1

У меня есть три канала. + добавлен класс конфигурации подписиИспользование пружинной интеграции, создание порядка создания бобов

@Configuration 
@EnableIntegration 
@PropertySource({ "..." }) 
@ComponentScan(basePackages = "...") 
public class HttpIntegrationConfig { 
    @Bean(name = "requestChannel") 
    public DirectChannel requestChannel() { 
     return new DirectChannel(); 
    } 

    @Bean(name = "responseChannel") 
    public DirectChannel responseChannel() { 
     return new DirectChannel(); 
    } 

    @Bean(name = "replyChannel") 
    public QueueChannel replyChannel() { 
     return new QueueChannel(); 
    } 

    ... 

Я хочу привнести в мой пользовательский класс обслуживания. Итак ... + добавлен метод FindAll

@Service 
public class ServiceMessagingGatewayService { 

    ... 

    @Autowired 
    DirectChannel requestChannel; 

    @Autowired 
    QueueChannel replyChannel; 

    public Object findAll() { 
     Message message = RestfulMessageBuilder.build(new Object(), "services"); 

     requestChannel.send(message); 

     Message<?> received = replyChannel.receive(); 

     return received.getPayload(); 
    } 

    ... 
} 

Но это инъекции вызывают последующее исключение:

[10:28:52.399] [RMI TCP Connection(2)-127.0.0.1] ERROR @ o.s.w.c.ContextLoader > Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serviceController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.<...>.<...>.service.service.ServiceMessagingGatewayService com.<...>.<...>.service.controller.ServiceController.serviceMessagingGatewayService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serviceMessagingGatewayService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.integration.channel.DirectChannel com.<...>.<...>.service.service.ServiceMessagingGatewayService.requestChannel; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.integration.channel.DirectChannel] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) 
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) 
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4810) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255) 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) 
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) 
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) 
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1675) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) 
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) 
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) 
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:465) 
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:415) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) 
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) 
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) 
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468) 
at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) 
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309) 
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401) 
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323) 
at sun.rmi.transport.Transport$1.run(Transport.java:200) 
at sun.rmi.transport.Transport$1.run(Transport.java:197) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.rmi.transport.Transport.serviceCall(Transport.java:196) 
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.<...>.<...>.service.service.ServiceMessagingGatewayService com.<...>.<...>.service.controller.ServiceController.serviceMessagingGatewayService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serviceMessagingGatewayService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.integration.channel.DirectChannel com.<...>.<...>.service.service.ServiceMessagingGatewayService.requestChannel; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.integration.channel.DirectChannel] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573) 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
... 58 common frames omitted 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serviceMessagingGatewayService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.integration.channel.DirectChannel com.<...>.<...>.service.service.ServiceMessagingGatewayService.requestChannel; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.integration.channel.DirectChannel] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) 
... 60 common frames omitted 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.integration.channel.DirectChannel com.<...>.<...>.service.service.ServiceMessagingGatewayService.requestChannel; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.integration.channel.DirectChannel] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573) 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
... 71 common frames omitted 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.integration.channel.DirectChannel] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) 
... 73 common frames omitted 

Как выше сообщения, контекст Spring не имеет бобов против них. Какие?! Итак, я модифицировал некоторый код, связанный с инъекциями.

@Autowired 
@Lazy 
DirectChannel requestChannel; 

@Autowired 
@Lazy 
QueueChannel replyChannel; 

Это не так, потому что свойство dataTypes канала имеет значение null. Это вызывает исключение NullReferenceException. Так ...

DirectChannel requestChannel = (DirectChannel)applicationContext.getBean("requestChannel"); 
QueueChannel replyChannel = (QueueChannel)applicationContext.getBean("replyChannel"); 

Это нормально. Без исключений. Это работает хорошо. Но, что я действительно хочу знать, почему @Autowired вызывает NoSuchBeanDefinitionException в моем случае?

ответ

0

пошлите дополнительную информацию о StackTrace по этому вопросу.

Похоже, что ваш ServiceMessagingGatewayService был поднят некоторыми BeanPostProcessor очень рано.

С другой стороны было бы лучше поделиться с нами небольшим заявлением с проблемой, чтобы играть с нашей стороны.

Ничего очевидного прямо сейчас. Извините ...

+0

Я добавил несколько фрагментов кода и полный стек. – Devcken

+0

И, ну, я не реализую 'ServiceMessagingGatewayService' by' BeanPostProcessor'. Это действительно странно. :( – Devcken

0

Это полностью моя вина.

Я применил @CompnentScan для нескольких классов конфигурации. Среди них есть дублированный путь пакета. Это вызывает хаос, как и выше.

Я только что определил их, тогда я нахожу душевное спокойствие.

спасибо Artem Bilan за полезный подсказку.

+0

Отлично, собирался попросить вас поделиться приложением наконец –