Ошибка внедрения зависимостей произошла, когда два разных пакета взаимосвязаны в spring

#java #spring

#java #spring

Вопрос:

Я не могу выполнить автоматическое подключение, когда автоматически подключается поле, существующее в другом пакете.

Мой код выглядит следующим образом

Вводящий класс

 package com.vmware.vchs.networkservice.extensions.http
@Component
public class HttpServiceClient implements ContextAware
{
@Autowired
JMXAgent jMXAgent;
....
};
 

Внедренный класс

 package com.vmware.vchs.networkservice.monitoring;

@Component
public class JMXAgent {
};
 

Мой XML-файл сканирования компонентов выглядит следующим образом

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:bean="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd"

<context:property-placeholder 
    location="classpath:environment.properties" 
    ignore-unresolvable="false"/>

<bean:component-scan base-package="com.vmware.vchs.networkservice"/>
</beans>
 

Ошибка

 Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Err
or creating bean with name 'httpServiceClient': Injection of autowired dependencies fai
led; nested exception is org.springframework.beans.factory.BeanCreationException: Could
not autowire field: com.vmware.vchs.networkservice.monitoring.JMXAgent com.vmware.vchs.
networkservice.extensions.http.HttpServiceClient.jmxAgent; nested exception is org.spri
ngframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [co
m.vmware.vchs.networkservice.monitoring.JMXAgent] found for dependency: expected at lea
st 1 bean which qualifies as autowire candidate for this dependency. Dependency annotat
ions: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
 

Комментарии:

1. Я предполагаю, что это веб-приложение, можете ли вы опубликовать web.xml файл (если он у вас есть) и XML, который его содержит component-scan ?

2. @AndreiStefan: добавлен файл xml

3. Вам нужно написать @Autowired перед объявлением JMXAgent

4. @SamwiseGamgee: Извините, я забыл добавить описание вопроса. Но я добавил это в код, и только из-за этого он не смог автоматически подключить это поле

5. В вашем исключении указано, что компонент не найден, что означает, что spring не может найти компонент для JMXAgent.

Ответ №1:

Для автоматического определения классов и регистрации определений компонентов я обычно использую context не bean :

 <?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context.xsd">

  <context:component-scan base-package="org.example"/>

</beans>
 

Обновить

 <context:component-scan base-package="com.vmware.vchs.networkservice"/>
<context:component-scan base-package="com.vmware.vchs.networkservice.extensions.http"/>
 

Ответ №2:

Моя программа считывает данные из разных xml. Так что это причина того, что компонент не найден