Весна: @Autowired не работает

Это не повторяющийся вопрос. Ответьте на этот вопрос. Я использую Spring 4.0.2. Это веб-приложение, в котором я использую RabbitMQ Server для одновременной обработки нескольких заданий. Я использовал объект @Autowired в службах контроллера и Daos. Он работает нормально.

Но когда мы использовали bean внутри RabbitMQ Listeners. Это дает Null. посмотри.

вот дерево проекта

Дерево проекта

Вот снимок класса TransformerClient.

@Component
public class TransformerClient {

     @Value("${TRANSFORMER_COMPONENT_URL}")
     private String TRANSFORMER_COMPONENT_URL;

     public TransformerClient() {
          super();
          logger.info("Instantiated " + getClass());
     }

     public static final Logger logger = LoggerFactory
        .getLogger(TransformerClient.class);
....
}

Вот класс TCListener.

Этот класс на самом деле является слушателем RabbitMq. Когда какое-либо задание помещается в очередь, оно отвечает за выполнение этого процесса соответственно. Автоматически выполнится функция onMessage ().

public class TCListener implements MessageListener {

    private static final Logger logger = LoggerFactory
        .getLogger(TCListener.class);

    @Autowired
    TransformerClient transformerClient;

    public TCListener() {
           super();
          logger.info("Instantiated " + getClass());
    }

    @override
    public void onMessage(Message message){
         if(transformerClient !=null)
               logger.info("Not null");
         else
               logger.info("null");
   }
}

Файл конфигурации сервлета:

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


    <!-- DispatcherServlet Context: defines this servlet's request-processing 
    infrastructure -->
    <!-- <context:property-placeholder location="classpath:amqp.properties"/> -->
    <context:property-placeholder
    system-properties-mode="ENVIRONMENT" location="classpath:*.properties" />

    <!-- Enables the Spring MVC @Controller programming model -->
    <!-- enable anno support -->
    <context:annotation-config />
    <!-- anno based req mapping controller -->
    <mvc:annotation-driven />

    <context:component-scan base-package="in.xxxx.broker" />
   .....
</beans:beans>

Когда я запускаю этот проект, создаются и создаются экземпляры Beans. Консольные результаты.

Консоль

Какие решения я пробовал:

1) Очистить и собрать проект из командной строки - mvn -X clean install

2) Проверить сканирование компонентов - ‹context: component-scan base-package =" in.xxxx.broker "/›

3) с использованием applicationContext.getBean ("idOfBean")

4) имя переменной изменено -> TRANSFORMER_COMPONENT_URL на transUrl

5) Изменено рабочее пространство

6) попробовал на недавно установленном Eclipse

Но по-прежнему он становится нулевым.

Обновление: 1

В файле Servlet-context.xml я попытался создать Bean и инициализировать значение TRANSFORMER_COMPONENT_URL, взяв значения из файла свойств, а также удалил аннотации @component и @Value из класса TransFormerClient.

<bean id="transformerClient" class="in.cdac.broker.client.TransformerClient">
        <property name="TRANSFORMER_COMPONENT_URL" value="${TRANSFORMER_COMPONENT_URL}"/>  
</bean>

Здесь автопроводка работает исправно. Я понял причину.


person Morez    schedule 29.10.2015    source источник
comment
По сути, это не может быть null, если это будет null, вы получите исключение, в котором говорится, что зависимость может быть найдена (если это управляемый bean-компонент Spring и у вас правильно настроена инъекция на основе аннотаций). затем ваши bean-компоненты создаются в разных контекстах, и ваш TCListener, для которого требуется TransformerClient, определяется в корневом контексте, который не может получить доступ к bean-компонентам, загруженным DispatcherServlet. Следовательно, даже если сканирование аннотаций было настроено правильно, оно не сработает.   -  person M. Deinum    schedule 29.10.2015
comment
@ M.Deinum, да, поскольку весенние бобы никогда не будут нулевыми. Я чувствую, что TCListener не создается в рамках Spring. Если я хочу сделать TCListener Spring Bean, как я могу это сделать?   -  person Morez    schedule 29.10.2015
comment
Если бы это было так, он не смог бы получить доступ к необходимому компоненту. Я бы сказал, что ваша конфигурация и настройка изначально ошибочны.   -  person M. Deinum    schedule 29.10.2015
comment
Ваш TCListener определяется корневым контекстом (загружается с помощью theContextLoaderListener, полагаю, у него нет <context:component-scan /> или <context:annotation-config />. Убедитесь, что и клиент, и слушатель созданы корневым контекстом, чтобы они могли видеть друг друга.   -  person M. Deinum    schedule 29.10.2015


Ответы (1)


Вам нужно интегрировать RabbitMQ и spring. Вы можете узнать здесь, как это сделать:

Можно написать примерно так:

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@EnableRabbit //need for activation of handler for annotation @RabbitListener
@Component
public class TCListener {
     private static final Logger logger = LoggerFactory
        .getLogger(TCListener.class);

    @Autowired
    TransformerClient transformerClient;

    @RabbitListener(containerFactory="myRabbitListenerContainerFactory", queues="myQueue")
    public void onMessage(String message) {
        if(transformerClient !=null){
               logger.info("Not null");
        }else{
               logger.info("null");
        }
    }
}

Также нужно добавить в конфигурацию spring:

 <rabbit:annotation-driven container-factory="myRabbitListenerContainerFactory"/>

     <bean id="myRabbitListenerContainerFactory"  class="org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory">
           // factory settings
     </bean>

Также вы можете просмотреть следующее руководство: https://spring.io/guides/gs/messaging-rabbitmq/

person user2224429    schedule 29.10.2015