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

Spring integration annotation Java 8 Optional Incorrect Handling

我正在使用 Spring boot 1.2.2.Release 和 Java 8,问题是 Spring 将 Optional payload 包装到新的 Optional 对象中多次通过 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.Optional 转换为 Foo)的原因是 payload 而不是包含 foo,因为值包含另一个可选对象,并且该可选对象包含 foo 作为值。

我读过 this 其中提到

Now Spring Integration consistently handles the Java 8's Optional type.

我什至尝试使用文档中提到的框架的确切版本,但没有成功

解决方法:我尝试创建一些包含有效载荷的 Wrapper(PayloadWrapper) 对象并且它有效。但可能还有其他方法吗?

我认为文档不清楚。问题是 spring 可以将 方法参数 转换为 Optional<Type>,但是在这种情况下,你的参数已经是一个 Optional,所以 Spring 再次包装它..

如果你的转换方法只是 return Foo(没有 Optional),那么 Spring 将包装一个 Foo 实例(或 'null' ) 在 Optional 中传递给 ServiceActivator