elwis
elwis

Reputation: 1405

Mule RegistrationException

So this one makes me wonder. I have a Mule integration with a couple of flows in it and they all work nice. Except for the last one. If I end that one in a file endpoint, it works as expected. But if I end it in my WS POST service.. I get an error complaining about multiple JAXB contexts. I have multiple JAXB contexts but as said they work fine if I'm not trying to post my JSON to that REST service. And somehow, I can't see that my HTTP endpoint has anything to do with JAXB either so I guess it's a misguiding error? But then, what is wrong with my HTTP endpoint, I use it as inbound in the other flows and also tried to create an entirely new one for this particular flow, but still this nagging about JAXB.

<http:request-config name="WS" host="127.0.0.1" port="81" doc:name="HTTP Request Configuration" basePath="WSService"/>
<http:request-config name="MQService" host="127.0.0.1" port="82" doc:name="HTTP Request Configuration" />
<mulexml:jaxb-context name="JAXB_A" packageNames="se.razorlib.SystemAProduct" doc:name="JAXB Context"/>
<mulexml:jaxb-context name="JAXB_B" packageNames="se.razorlib.SystemAPurchase" doc:name="JAXB Context"/>
<mulexml:jaxb-context name="JAXB_C" packageNames="se.razorlib.SystemAOrder" doc:name="JAXB Context"/>
<context:property-placeholder location="razorlib.properties"/>
 <flow name="ProductToSystemA">
    ....
   <http:request config-ref="WS" path="Product/REST/GetProduct/{id}/{index}" method="GET" doc:name="WS">
        <http:request-builder>
            <http:uri-param paramName="id" value="${WS.id}"/>
            <http:uri-param paramName="index" value="1"/>
        </http:request-builder>
   </http:request>   
    .....
 </flow>
<flow name="PurchaseToSystemA">
    .....
</flow>

.....

and this particular flow

    <flow name="PurchaseDeliver">
    <file:inbound-endpoint path="C:\temp\fileIn" responseTimeout="10000" doc:name="FileIn"/>
   <mulexml:jaxb-xml-to-object-transformer returnClass="se.razorlib.SystemAPurchase.Header" encoding="UTF-16" jaxbContext-ref="JAXB_B" doc:name="XML to JAXB Object"/>
    <custom-transformer returnClass="java.util.List" encoding="utf-16" class="se.razorlib.Transformer.Map2ZZPurchase" doc:name="Map2ZZ"/>
    <json:object-to-json-transformer encoding="UTF-16" doc:name="Object to JSON"/>
    <logger message="'Payload ' #[payload]" level="INFO" doc:name="Logger"/>
    <http:request config-ref="WS" path="PurchaseSvc/REST/Deliver/{id}" method="POST" doc:name="WSDeliver">
        <http:request-builder>
            <http:uri-param paramName="id" value="${WS.id}"/>
        </http:request-builder>
   </http:request>
   <!--  <file:outbound-endpoint path="C:\temp\fileOut" responseTimeout="10000" doc:name="File" outputPattern="inkop2ZZ-#[function:dateStamp].json" mimeType="text/json" encoding="UTF-8"/> -->
    <catch-exception-strategy doc:name="Catch Exception Strategy">
        <logger message="Oh no!!" level="INFO" doc:name="Logger"/>
        <file:outbound-endpoint path="C:\temp\fileError" responseTimeout="10000" doc:name="File" outputPattern="error-inkop2ZZ-#[function:dateStamp].xml" mimeType="text/xml" encoding="UTF-8"/>
    </catch-exception-strategy>
</flow>    

The error I get is this one:

Root Exception stack trace: org.mule.api.registry.RegistrationException: More than one object of type class javax.xml.bind.JAXBContext registered but only one expected.

Regards

Upvotes: 1

Views: 223

Answers (2)

David Whitehurst
David Whitehurst

Reputation: 352

First I would not be surprised that the file endpoint gave no error. The file doesn't care what it gets. It just wants ones and zeros. I somewhat agree with the answer above but I think you only need to reference the package for the three Java bindings.

<mulexml:jaxb-context name="myJaxb" packageNames="se.razorlib"/>

You are defining the context for JAXB transformations. The package says it all.

Upvotes: 1

Star
Star

Reputation: 1503

I have seen a similar scenario's, this might be because of Multiple jaxb-context. Resolved by placing all the packages in one Context

  <mulexml:jaxb-context name="JaxbContext" packageNames="se.razorlib.SystemAProduct:se.razorlib.SystemAPurchase:se.razorlib.SystemAOrder"/>

In flow

 <mulexml:jaxb-xml-to-object-transformer returnClass="se.razorlib.SystemAPurchase.Header" encoding="UTF-16" jaxbContext-ref="JaxbContext" doc:name="XML to JAXB Object"/>

Hope this helps.

Upvotes: 1

Related Questions