You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Andreas Bucksteeg <an...@hybris.de> on 2007/06/08 19:04:51 UTC

WG: Custom serializer / deserializer in cxf?

Hi Freeman, 

I have been assigned to another project for the last three weeks or so, therefore I had no time to solve my implementation probs... 

I have played a little and I think I know how to solve my problem by using handler, but I think that it would not be very efficient... 

Currently my cxf service implementation is returning the follwing soap message:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns1:getBinaryFileResponse xmlns:ns1="http://some.url">
      <GetBinaryFileResult xmlns:ns2="http://www.w3.org/2005/08/addressing/wsdl" xmlns:ns3=" some.url/Schema">
        <file>
        <content>PD94bWwgdmVyc2lvbj0iMS4wIj8+1sCglkYXRlO
G9tYWluPgoJCTxpZD4zMDAwPC9pZD4KCQk8ZG9tYWluY2xhc3NpZD4xPC9kb21haW5jbGFzc2lkPgoJCTxuYW1lPkJhZWNobGk8L25hbWU+Cgk8L2RvbWFpb
j4KPC9kb21haW5zPgo=</content>
          <filename>domain.xml</filename>
          <mimetype>text/xml</mimetype>
          <size>1349</size>
        </file>
        <ns3:resultCode>0</ns3:resultCode>
      </GetBinaryFileResult>
    </ns1:getBinaryFileResponse>
  </soap:Body>
</soap:Envelope>

The following message was generated by the old Axis 1.x implementation:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <ns1:putBinaryFile soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://werk-ii.de/soap/comet">
      <sessionId xsi:type="xsd:string">s6278514638240</sessionId>
      <fileId xsi:type="xsd:string">actions.xml</fileId>
      <file xsi:type="ns2:CometBinary" xmlns:ns2="some.url">
        <filename xsi:type="xsd:string">actions.xml</filename>
        <mimetype xsi:type="xsd:string">text/xml</mimetype>
        <size xsi:type="xsd:int">5965</size>
        <content href="cid:FB5BAE5C8AF988A00C7DC5269937F707"/>
      </file>
    </ns1:putBinaryFile>
  </soapenv:Body>
</soapenv:Envelope>

As I mentioned before, the content of the tag <file> should not be embedded, it should be send as an attachment and the tag should just reference to it using the attribute href and the Content ID. 

I could use the Handler to modify the outgoing message (extract the <content> body, remove it from the message, create a attachment from the extracted body of <content> and use the ContentID of the attachment to add the href="cid:xyz" attribute to the <content> tag in the message. But this does not look like the right approach, as in my opinion the message should be created in the right format. 

So I am looking for a way to hook into the serialization process of <file> instances  (as File is actually a Java class with the properties content, filename, mimetype, size) to created the message directly in the needed format. Actually I would only need to override the default serialization for the content property...

Regards from Munich,

Andreas

P.S. Keep in mind that I can not change the expected message format since the client is a third party tool, which I can not modify....




-----Ursprüngliche Nachricht-----
Von: Freeman Fang [mailto:freeman.fang@iona.com] 
Gesendet: Montag, 14. Mai 2007 04:03
An: cxf-user@incubator.apache.org
Betreff: Re: Custom serializer / deserializer in cxf?

Hi Andreas,

I believe you can use jax-ws soap protocol handler to do your attachment 
serializer.
The client could use a SOAP protocol handler(SWAClientHandler) which 
reads several attachments from file or just like your code shows, from 
the data source, and appends
them to the outbound SOAP request using SAAJ API. This handler is specified
programatically.

The server code registers a handler using the @HandlerChain annotation
within the service implementation class. In this case, SWAServerHandler
is SOAPHandler that checks and saves attachments on
inbound requests.

Attachment is client handler and server handler shows how to 
serialize/dserialize your attachment.
The client handler shows how to read attachment from file and you need 
change to read from data source in your case.
Also you need add code like
SWAClientHandler sh = new SWAClientHandler();
List<Handler> newHandlerChain = new ArrayList<Handler>();
newHandlerChain.add(sh);
((BindingProvider)port).getBinding().setHandlerChain(newHandlerChain);
in your client mainline to register client handler and add annotation like
@HandlerChain(file = "../common/swa_handlers.xml", name = 
"SWAHandlerChain") in your serviceImpl code to register server handler.

You can see cxf handlers sample to get more idea how jax-ws handler works.
Thanks very much

Freeman


Re: WG: Custom serializer / deserializer in cxf?

Posted by Freeman Fang <fr...@iona.com>.
Hi Andreas,
For your case, you can modify your wsdl which message part only include 
filename, mimetype, and size so that the initial outgoing message will 
not include the real attachment content, then you can append the real 
attachement content in your handler as you already do.

Cheers

Freeman

Andreas Bucksteeg wrote:
> Hi Freeman, 
>
> I have been assigned to another project for the last three weeks or so, therefore I had no time to solve my implementation probs... 
>
> I have played a little and I think I know how to solve my problem by using handler, but I think that it would not be very efficient... 
>
> Currently my cxf service implementation is returning the follwing soap message:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
>   <soap:Body>
>     <ns1:getBinaryFileResponse xmlns:ns1="http://some.url">
>       <GetBinaryFileResult xmlns:ns2="http://www.w3.org/2005/08/addressing/wsdl" xmlns:ns3=" some.url/Schema">
>         <file>
>         <content>PD94bWwgdmVyc2lvbj0iMS4wIj8+1sCglkYXRlO
> G9tYWluPgoJCTxpZD4zMDAwPC9pZD4KCQk8ZG9tYWluY2xhc3NpZD4xPC9kb21haW5jbGFzc2lkPgoJCTxuYW1lPkJhZWNobGk8L25hbWU+Cgk8L2RvbWFpb
> j4KPC9kb21haW5zPgo=</content>
>           <filename>domain.xml</filename>
>           <mimetype>text/xml</mimetype>
>           <size>1349</size>
>         </file>
>         <ns3:resultCode>0</ns3:resultCode>
>       </GetBinaryFileResult>
>     </ns1:getBinaryFileResponse>
>   </soap:Body>
> </soap:Envelope>
>
> The following message was generated by the old Axis 1.x implementation:
> <?xml version="1.0" encoding="UTF-8"?>
> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
>   <soapenv:Body>
>     <ns1:putBinaryFile soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://werk-ii.de/soap/comet">
>       <sessionId xsi:type="xsd:string">s6278514638240</sessionId>
>       <fileId xsi:type="xsd:string">actions.xml</fileId>
>       <file xsi:type="ns2:CometBinary" xmlns:ns2="some.url">
>         <filename xsi:type="xsd:string">actions.xml</filename>
>         <mimetype xsi:type="xsd:string">text/xml</mimetype>
>         <size xsi:type="xsd:int">5965</size>
>         <content href="cid:FB5BAE5C8AF988A00C7DC5269937F707"/>
>       </file>
>     </ns1:putBinaryFile>
>   </soapenv:Body>
> </soapenv:Envelope>
>
> As I mentioned before, the content of the tag <file> should not be embedded, it should be send as an attachment and the tag should just reference to it using the attribute href and the Content ID. 
>
> I could use the Handler to modify the outgoing message (extract the <content> body, remove it from the message, create a attachment from the extracted body of <content> and use the ContentID of the attachment to add the href="cid:xyz" attribute to the <content> tag in the message. But this does not look like the right approach, as in my opinion the message should be created in the right format. 
>
> So I am looking for a way to hook into the serialization process of <file> instances  (as File is actually a Java class with the properties content, filename, mimetype, size) to created the message directly in the needed format. Actually I would only need to override the default serialization for the content property...
>
> Regards from Munich,
>
> Andreas
>
> P.S. Keep in mind that I can not change the expected message format since the client is a third party tool, which I can not modify....
>
>
>
>
> -----Ursprüngliche Nachricht-----
> Von: Freeman Fang [mailto:freeman.fang@iona.com] 
> Gesendet: Montag, 14. Mai 2007 04:03
> An: cxf-user@incubator.apache.org
> Betreff: Re: Custom serializer / deserializer in cxf?
>
> Hi Andreas,
>
> I believe you can use jax-ws soap protocol handler to do your attachment 
> serializer.
> The client could use a SOAP protocol handler(SWAClientHandler) which 
> reads several attachments from file or just like your code shows, from 
> the data source, and appends
> them to the outbound SOAP request using SAAJ API. This handler is specified
> programatically.
>
> The server code registers a handler using the @HandlerChain annotation
> within the service implementation class. In this case, SWAServerHandler
> is SOAPHandler that checks and saves attachments on
> inbound requests.
>
> Attachment is client handler and server handler shows how to 
> serialize/dserialize your attachment.
> The client handler shows how to read attachment from file and you need 
> change to read from data source in your case.
> Also you need add code like
> SWAClientHandler sh = new SWAClientHandler();
> List<Handler> newHandlerChain = new ArrayList<Handler>();
> newHandlerChain.add(sh);
> ((BindingProvider)port).getBinding().setHandlerChain(newHandlerChain);
> in your client mainline to register client handler and add annotation like
> @HandlerChain(file = "../common/swa_handlers.xml", name = 
> "SWAHandlerChain") in your serviceImpl code to register server handler.
>
> You can see cxf handlers sample to get more idea how jax-ws handler works.
> Thanks very much
>
> Freeman
>
>