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
我正在使用 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