【问题标题】:Mule Collection-splitter throwing exception: CopyOnWriteArrayList cannot be cast to java.lang.StringMule Collection-splitter 抛出异常:CopyOnWriteArrayList 无法转换为 java.lang.String
【发布时间】:2013-11-20 03:24:51
【问题描述】:

在这里,我的 java 组件返回了一个 arrylist,我正在使用 Collection 拆分器拆分它,并窃听列表对象。 但是当我改变我原来的paylaod时,在窃听之后它就不起作用了。我得到了类转换异常 CopyOnWriteArrayList 不能强制转换为 java.lang.String。我认为拆分的对象在流程结束时被聚合,而不使用任何额外的 聚合器,我不明白为什么我没有通过设置有效负载转换器获得更改的有效负载。

以下是流程源码-

<flow name="StandaloneTestFlow1" doc:name="StandaloneTestFlow1">
        <http:inbound-endpoint exchange-pattern="request-response"   doc:name="HTTP" address="http://0.0.0.0:10114/jaxbtest"/>
        <cxf:jaxws-service serviceClass="com.standalone.test.StandaloneTest" doc:name="SOAP"/>
        <component doc:name="Java">
            <method-entry-point-resolver>
                <include-entry-point method="getxmlString"/>
            </method-entry-point-resolver>  
            <spring-object bean="standalonBean"/>
        </component>
        <collection-splitter doc:name="Collection Splitter"/>
        <mulexml:jaxb-object-to-xml-transformer name="autoBeanToSmartxml" jaxbContext-ref="testJaxbContext"/>
        <object-to-string-transformer doc:name="Object to String"/>
        <wire-tap>
            <vm:outbound-endpoint address="vm://testJaxbvm"/>
        </wire-tap>
        <set-payload value="adfafasdfasdfasd " doc:name="Set Payload"/>
 </flow>

以下是异常堆栈-

org.apache.cxf.interceptor.Fault: java.util.concurrent.CopyOnWriteArrayList cannot be cast to java.lang.String
        at org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:116)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)

【问题讨论】:

  • 请发布完整的堆栈。另外请提高您的声誉:有很多问题您没有接受答案。

标签: jaxb mule jaxb2 mule-studio


【解决方案1】:

Mule 的Collection Splitter 是这个问题的原因。

Collection Splitter 将 Collection 对象拆分为单独的对象,并将每个对象传递给 remaining flow one at a time 的下一部分。它就像iterating the collection 并在迭代循环中执行剩余的流程。

这是一个 HTTP request-response 入站。因此,在集合拆分器拆分集合并根据集合的大小多次执行剩余流之后。结束响应由 mule 聚合并作为响应返回。但是因为它是JAXWS 服务,所以方法签名可能已经返回了一个字符串。所以有一个类转换异常。

所以有两个选择。

Either changes the  return type of the method to CopyOnWriteArraylist  which provied with an output like
<response>
 <greeting>adfafasdfasdfasd</greeting>
     <greeting>adfafasdfasdfasd</greeting>
     <greeting>adfafasdfasdfasd</greeting>
     <greeting>adfafasdfasdfasd</greeting>
     <greeting>adfafasdfasdfasd</greeting>
     <greeting>adfafasdfasdfasd</greeting>
     <greeting>adfafasdfasdfasd</greeting>
     <greeting>adfafasdfasdfasd</greeting>
 </response>

Change the logic to avoid using collection splitter.

这里有更多关于 Collection Splitter 的信息。

Mule Collection Splitter

【讨论】:

  • 我在 之前添加了集合聚合器,它工作正常。我在这里理解的是集合拆分器正在一个一个地发送集合对象直到流程结束。所以我们还必须在对有效负载执行 或任何其他操作之前聚合对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多