【问题标题】:Spring integration annotation Java 8 Optional Incorrect HandlingSpring集成注释Java 8可选错误处理
【发布时间】:2015-05-06 01:51:31
【问题描述】:

我正在使用 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(cannot cast java.util.Optional to Foo) 的原因是因为 payload 而不是包含 foo 作为值包含另一个 Optional 对象,而该 Optional 对象包含 foo 作为值。

我读过this 提到的地方

现在 Spring Integration 始终如一地处理 Java 8 的 Optional 输入。

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

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

【问题讨论】:

    标签: java spring java-8 spring-boot spring-integration


    【解决方案1】:

    我认为文档不清楚。问题是spring可以把方法参数转换成Optional&lt;Type&gt;,但是在这种情况下,你的参数已经是Optional了,所以Spring又把它包裹了一遍..

    如果你让你的转换方法只返回Foo(没有Optional),那么当传递给ServiceActivator时,Spring会在Optional中包装一个Foo实例(或'null')

    【讨论】:

    • 这是一个很好的解决方法,谢谢。但无论如何,有一个错误超出了 Spring 集成范围:ObjectToOptionalConverter,它不关心源 Optional&lt;?&gt; 类型:jira.spring.io/browse/SPR-12785
    • @ArtemBilan 感谢您创建问题,现在它的状态已解决,只是等待新版本的发生。
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2015-05-24
    • 2018-07-05
    • 2015-10-03
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    相关资源
    最近更新 更多