Это не повторяющийся вопрос. Ответьте на этот вопрос. Я использую 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>
Здесь автопроводка работает исправно. Я понял причину.
null
, если это будетnull
, вы получите исключение, в котором говорится, что зависимость может быть найдена (если это управляемый bean-компонент Spring и у вас правильно настроена инъекция на основе аннотаций). затем ваши bean-компоненты создаются в разных контекстах, и вашTCListener
, для которого требуетсяTransformerClient
, определяется в корневом контексте, который не может получить доступ к bean-компонентам, загруженнымDispatcherServlet
. Следовательно, даже если сканирование аннотаций было настроено правильно, оно не сработает. - person M. Deinum   schedule 29.10.2015TCListener
определяется корневым контекстом (загружается с помощью theContextLoaderListener
, полагаю, у него нет<context:component-scan />
или<context:annotation-config />
. Убедитесь, что и клиент, и слушатель созданы корневым контекстом, чтобы они могли видеть друг друга. - person M. Deinum   schedule 29.10.2015