我使用的是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
中