尝试从<int-jdbc:outbound-gateway>获取数据时出现ReplyRequiredException吗?

时间:2018-11-23 21:39:34

标签: spring-integration

我想定义一个 <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'未产生任何答复,并且其'requiresReply'属性设置为true。

我决定更加关注位于GitHub上 spring-integration-samples 存储库中的spring中的example,但看起来它也无法按预期工作。我在尝试通过名称foo查找用户的示例项目中遇到了完全相同的异常。您可以使用位于GitHub上的basic jdbc example和以下测试方法轻松重现异常:

@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 :(得分:2)

fixed the sample

很久以前,我们将public class TData implements Serializable { Matrix originalMatrix; public Path path; PointF position; private TData attachedPathData; public void setAttachedPathData(TData pathData){ attachedPathData = pathData; } public TData getAttachedPathData(){ return attachedPathData; } public TData(){ } public TData(Path path, PointF position, String id, String fillColor, String strokeColor){ this.path = path; this.position = position; this.id = id; this.fillColor = fillColor; this.strokeColor = strokeColor; } public void Scale(float scaleX, float scaleY){ this.scaleX = scaleX; this.scaleY = scaleY; Matrix scaleMatrix = new Matrix(); RectF rectF = new RectF(); path.computeBounds(rectF, true); scaleMatrix.setScale(scaleX,scaleY); path.transform(scaleMatrix); Matrix mat = new Matrix(); path.computeBounds(rf, true); Region r = new Region(); } } 的默认值更改为requires-reply,但是示例从未更新。

  

true

但是,如果没有收到结果,则assertThat(foo, is(not(empty())));List<Person>

编辑

  

但是我希望如果ResultSet为空,则空列表而不是null。

那不是它的工作方式。

如果resultSet为空,则返回null(因此,您看到的是原始错误)。

如果resultSet有1个条目,则仅返回该条目。

否则,将返回实体列表。

null

一直以来都是这样,但我相信单个对象Vs。列表有误(如果Object payload = list; if (list.isEmpty()) { return null; } if (list.size() == 1) { payload = list.get(0); } return payload; )。

maxRows > 1默认情况下为1,因此有意义。但是,如果maxRows> 1并且仅返回1行,我认为它应该仍然是1的列表。应用程序不必检查结果的类型。它期望一个列表或单个对象(或null)。 INT-4559