Mule Collection-splitter抛出异常:CopyOnWriteArrayList无法强制转换为java.lang.String

时间:2013-11-19 08:31:49

标签: jaxb mule jaxb2 mule-studio

这里我的java组件返回了一个arrylist,我正在使用Collection splitter进行拆分,并点击列表对象。  但是当我更换原来的paylaod之后,一旦电线窃听之后,它就无法工作了。我得到了阶级演员的例外  CopyOnWriteArrayList无法强制转换为java.lang.String。我认为分裂对象在流程结束时聚合,而不使用任何额外的  聚合器,我不明白为什么我没有通过set-payload变换器获得更改的有效载荷。

下面是流程源代码 -

<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)

1 个答案:

答案 0 :(得分:1)

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

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

这是一个HTTP request-response入站。因此,在收集拆分器拆分集合并根据集合的大小多次执行剩余流程之后。最终响应由mule汇总,并作为响应返回。但由于它是JAXWS服务,因此方法签名可能返回了一个String。所以有一个类强制转换异常。

所以有两种选择。

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