Автоматическая аннотация игнорируется в операторе верблюда - PullRequest
1 голос
/ 27 марта 2019

Мне нужно реализовать соединение БД и запрос в шаге процесса. Итак, я определил источник данных в свойстве бина. И я попытался использовать jdbctemplate. Но результат возвращается с java.lang.NullPointException.

Верблюд игнорирует автоматическую аннотацию в операторе процесса? Если есть другое решение, дайте мне знать, пожалуйста.

Спасибо.

CamelContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:camel="http://camel.apache.org/schema/spring"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
... 
http://camel.apache.org/schema/spring/camel-spring.xsd">
<bean class="com.ktds.openmzn.common.bean.ProcFormat" id="procFormat"/>
<bean class="com.ktds.openmzn.common.bean.ProcessDistributor" id="splitChannel"/>
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
    <property name="driverClassName" value="${spring.datasource.driver-class-name}"/>
    <property name="url" value="${spring.datasource.url}"/>
    <property name="username" value="${spring.datasource.username}"/>
    <property name="password" value="${spring.datasource.password}"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>
<bean class="com.ktds.openmzn.common.bean.FilePathProcessor" id="filePathProcessor"/>
...
<camelContext id="camelContext-f611cb6c-d516-4346-9adc-5512d327a88d"
    trace="true" xmlns="http://camel.apache.org/schema/spring">
    <camel:route id="fixed_processor">
        <camel:from id="_from1" uri="timer:fromPollTimer?period=20000"/>
        <camel:process id="_sourceDirectory" ref="filePathProcessor"/>
...

FilePathProcessor.java

public class FilePathProcessor implements Processor {
...
    @Override
public void process(Exchange exchange) throws Exception {
         List<Map<String, Object>> rows = SetFilePath.getInstance().getPathList("aaaa");

SetFilePath.java

@ManagedResource
public class SetFilePath {
private static SetFilePath instance = null;
private String sourceDirectory;
private String targetDirectory;

@Autowired
private JdbcTemplate jdbcTemplate;

public static SetFilePath getInstance() {
    if(instance == null) {
        instance = new SetFilePath();
    }   

    return instance;
}

Результат

Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId              ProcessorId          Processor                                                                        
Elapsed (ms)
[fixed_processor   ] [fixed_processor   ] [timer://fromPollTimer?period=20000                                            ] [         0]
[fixed_processor   ] [_sourceDirectory  ] [ref:filePathProcessor                                                         ] [         0]

Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------

java.lang.NullPointerException: null
at com.ktds.openmzn.common.bean.FilePathProcessor.process(FilePathProcessor.java:20) ~[classes/:na]
at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63) ~[camel-core-2.23.1.jar:2.23.1]

1 Ответ

0 голосов
/ 27 марта 2019

Ну, конечно, он нулевой, потому что вы сами создаете экземпляр с помощью нового конструктора:

instance = new SetFilePath();

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1003* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1003*.

Существуют различные способы сделать это, например, создать <bean> в файле XML и затем настроить его на своем процессоре с помощью установщика <property>.

Вы также можете позволить spring / camel создавать экземпляр bean-компонента вместо нового конструктора, но для этого требуется немного API-интерфейса Camel

public static SetFilePath getInstance(CamelContext camel)
  if (instance == null) {
    instance = camel.getInjector().newInstance(SetFilePath.class);
}   

Который затем через инжектор 1015 * создаст экземпляр компонента с помощью пружинного каркаса, который выполняет автоматическое подключение.

...