Spring集成注释Java 8可选错误处理



我使用的是Spring boot 1.2.2.Release和Java 8,问题是Spring将Optional payload封装到新的可选对象中的次数与我将其传递到transformer/service activator的次数一样多。例如

@ServiceActivator(inputChannel = ..., outputChannel = ...) 
public Optional<Foo> transform() {returns -> Optional.of(foo);}
@ServiceActivator(inputChannel = ..., outputChannel = ...)
public Optional<Foo> doSomething1(Optional<Foo> payload) {
     payload.ifPresent(f -> {System.out.println(f.getId());}); // this line throws ClassCastException 
  return foo;
}

上面的代码之所以抛出ClassCastExcpetion(不能将java.util.Optial强制转换为Foo),是因为payload(而不是包含foo作为值)包含另一个Optional Object,而该Optional对象包含foo作为值。

我读过这篇文章,其中提到

现在Spring Integration一致地处理Java 8的可选类型

我甚至尝试了文件中提到的框架的确切版本,但没有成功

解决方法:我试图创建一些包含有效负载的Wrapper(PayloadWrapper)对象,它可以工作。但可能还有别的办法吗?

我认为文档不清楚。问题是spring可以将方法参数转换为Optional<Type>,但在这种情况下,您的参数已经是Optional,因此spring将其重新包装。。

如果您使转换方法只返回Foo(没有Optional),那么Spring将在传递给ServiceActivator 时将Foo实例(或"null")包装在Optional

最新更新