ReplyRequiredException при попытке получить данные из? - PullRequest
0 голосов
/ 24 ноября 2018

Я бы хотел определить <int-jdbc:outbound-gateway/> с query и без update для извлечения данных из базы данных.Затем я хотел бы использовать int-jdbc:outbound-gateway в качестве реализации Service.findSomeData() метода интерфейса.Данные, полученные из реализации интерфейса, используются в классе CheckService моего специального преобразователя.См. Конфигурацию ниже:

<int:service-activator method=“performCheck”>
       <bean class=“com.example.service.CheckService”
             c:service-ref=“service”
 </int:service-activator>

<int:gateway id=“service” service-interface=“com.example.service.Service”>
   <int:method name=“findSomeData” request-channel=“jdbcChan” reply-channel=“jdbcChanReply”/>
</int:gateway>

<int-jdbc:outbound-gateway request-channel=“jdbcChan”
                          data-source=“pooledDs” row-mapper=“dataRowMapper” reply-channel=“jdbcChanReply”>
   <int-jdbc:query>
       select some, data from some_table
   </int-jdbc:query>

Проблема в том, что я получаю исключение ReplyRequiredException, когда перемещаю свою полезную нагрузку в jdbcChan:

org.springframework.integration.handler.ReplyRequiredException: Нет ответа от обработчика 'org.springframework.integration.jdbc.JdbcOutboundGateway # 0', а его свойство 'requireReply' имеет значение true.

Я решилчтобы обратить больше внимания на пример , расположенный весной в репозитории spring-интеграция-samples на GitHub, но, похоже, он также не работает должным образом.Я получаю точно такое же исключение в примере проекта, пытающегося найти пользователя по имени foo.Вы можете легко воспроизвести исключение, используя basic jdbc example , расположенный на GitHub, и следующий метод тестирования:

@Test
public void findPerson() {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
            "/META-INF/spring/integration/spring-integration-context.xml");
    PersonService service = context.getBean(PersonService.class);
    final List<Person> foo = service.findPersonByName("foo");
    assertThat(foo, is(not(empty())));
}

Я делаю это неправильно или в последней версии Spring Integration JDBC есть ошибка?(для меня похоже даже пример сломан)

1 Ответ

0 голосов
/ 24 ноября 2018

I исправил образец .

Мы давно изменили значение по умолчанию для requires-reply на true, но образец никогда не обновлялся.

assertThat(foo, is(not(empty())));

Однако List<Person> равно null, если не получено никаких результатов.

РЕДАКТИРОВАТЬ

Но я бы ожидал пустой список вместо нуля, если ResultSet был пуст.

Это не так.

Если resultSet пуст, возвращается null (следовательно, исходная ошибка, которую вы видели).

Если в resultSet есть 1 запись, возвращается только эта запись.

В противном случае возвращается список объектов.

Object payload = list;
if (list.isEmpty()) {
    return null;
}
if (list.size() == 1) {
    payload = list.get(0);
}
return payload;

Так было всегда, но я верю, что один объект против.Список неверен (если maxRows > 1).

maxRows по умолчанию равен 1, так что тогда это имело смысл;однако, если maxRows равен> 1 и возвращается только 1 строка, я думаю, что это все равно должен быть список из 1. Приложение не должно проверять тип результата.Ожидается либо список, либо единственный объект (или ноль). INT-4559 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...