Hi Dan, Thanks a lot for your quick and detailed response!
I will try the options provided by you. Hope everything goes well~~ :) Yuval 2008/3/20, Daniel Kulp <[EMAIL PROTECTED]>: > > > This is definitely a bug for whomever is consuming that message. > According to the XML rules, both messages are equivilent. > > Couple options: > > 1) Best performing option: write an interceptor that would be > immediately AFTER the StaxOutInterceptor that would take the > XMLStreamWriter and replace it with a new XMLStreamWriter that wrappers > the original, but overwrides the start element and namespace map stuff > so that it generates empty prefixes at all times. That StreamWriter > might be a bit tricky to write if you aren't familliar with StAX, but it > would definitely be the best performing as you wouln't break the > streaming, you wouldn't need to scan the byte[], etc.... FYI: your > interceptor will also need to set: > msg.put( > AbstractOutDatabindingInterceptor.DISABLE_OUTPUTSTREAM_OPTIMIZATION, > Boolean.TRUE); > to make sure it actually uses the new StreamWriter in all cases. > > > 2) Next option: your CachedOutputStream stuff..... This actually will > work, but you need to modify things a bit. First off, it needs to be > split into two interceptors: (usually, it's one interceptor.java that > then has an inner class for the other. See the AttachmentOutInterceptor > for example) > a) First/Outer one will replace the OutputStream with the cached > output stream and record the original stream. It will also then add > the second one to the chain. Make sure it's stuck before the attachement > stuff: > super(Phase.PRE_STREAM); > addBefore(AttachmentOutInterceptor.class.getName()); > > b) The second/inner interceptor would grab the Cached stream, do the > transformation, and flush back to original stream. It would be: > super(Phase.PRE_STREAM_ENDING); > addAfter(AttachmentOutInterceptor.AttachmentOutEndingInterceptor > .class.getName()); > > Dan > > > > > > On Thursday 20 March 2008, Yuval Zou wrote: > > Hi, > > > > Recently, I'm working on a web services client using CXF. But some > > request messages can't be parsed by the web services server. I found > > the problem is related to the namespace and prefix. > > The correct message: > > <?xml version="1.0" encoding="UTF-8"?> > > <CreateItemRequest > > xmlns="http://www.ibm.com/xmlns/db2/cm/beans/1.0/schema"> > > <AuthenticationData> > > <ServerDef> > > <ServerName>icmnlsdb</ServerName> > > </ServerDef> > > <LoginData> > > <UserID>icmadmin</UserID> > > <Password>********</Password> > > </LoginData> > > </AuthenticationData> > > <Item> > > <ItemXML> > > <CLAIM_1047 DATE_1047="2004-01-27" CLAIMNO_1047="1234" > > DESC_1047="This is a claim regarding the accident.3"> > > <properties xmlns="http://www.ibm.com/xmlns/db2/cm/api/1.0/schema" > > type="document"/> > > <VEHICLE_1047 VIN_1047="38"> > > <OWNER_1047 FNAME_1047="Ben" LNAME_1047="Dover"/> > > <OWNER_1047 FNAME_1047="Eileen" LNAME_1047="Dover"/> > > </VEHICLE_1047> > > <VEHICLE_1047 VIN_1047="34"> > > <OWNER_1047 FNAME_1047="I.P." LNAME_1047="Freely"/> > > </VEHICLE_1047> > > <ICMBASE> > > <resourceObject > > xmlns="http://www.ibm.com/xmlns/db2/cm/api/1.0/schema" > > MIMEType="image/tiff"> > > <label name="base 1"/> > > </resourceObject> > > </ICMBASE> > > </CLAIM_1047> > > </ItemXML> > > </Item> > > </CreateItemRequest> > > The namespace http://www.ibm.com/xmlns/db2/cm/api/1.0/schema was put > > in the element that needs it in this correct message. > > > > The mesage can't be parsed by server (sent by CXF): > > <?xml version="1.0" encoding="UTF-8"?> > > <CreateItemRequest > > xmlns:ns2="http://www.ibm.com/xmlns/db2/cm/api/1.0/schema" > > xmlns="http://www.ibm.com/xmlns/db2/cm/beans/1.0/schema"> > > <AuthenticationData> > > <ServerDef> > > <ServerName>icmnlsdb</ServerName> > > </ServerDef> > > <LoginData> > > <UserID>icmadmin</UserID> > > <Password>********</Password> > > </LoginData> > > </AuthenticationData> > > <Item> > > <ItemXML> > > <CLAIM_1047 DESC_1047="This is a claim regarding the accident.3" > > CLAIMNO_1047="1234" DATE_1047="2004-01-27"> > > <ns2:properties type="document"/> > > <VEHICLE_1047 VIN_1047="38"> > > <OWNER_1047 LNAME_1047="Dover" FNAME_1047="Ben"/> > > <OWNER_1047 LNAME_1047="Dover" FNAME_1047="Eileen"/> > > </VEHICLE_1047> > > <VEHICLE_1047 VIN_1047="34"> > > <OWNER_1047 LNAME_1047="Freely" FNAME_1047="I.P."/> > > </VEHICLE_1047> > > <ICMBASE> > > <ns2:resourceObject MIMEType="image/tiff"> > > <ns2:label name="base 1"/> > > </ns2:resourceObject> > > </ICMBASE> > > </CLAIM_1047> > > </ItemXML> > > </Item> > > </CreateItemRequest> > > > > The namespace http://www.ibm.com/xmlns/db2/cm/api/1.0/schema was put > > in the root element. > > > > Is there anyone who knows how to configure CXF to generate the XML > > message in accordance with the first style? Or is there possible to > > manually modify the generated message using out Interceptor? > > Actually, I have tried to use interceptor the modify the output > > stream: public StreamInterceptor() { > > super(Phase.PRE_STREAM); > > addBefore(SoapPreProtocolOutInterceptor.class.getName()); > > } > > > > public void handleMessage(Message message) { > > OutputStream os = message.getContent(OutputStream.class); > > CachedStream cs = new CachedStream(); > > message.setContent(OutputStream.class, cs); > > > > message.getInterceptorChain().doIntercept(message); > > > > try { > > cs.flush(); > > CachedOutputStream csnew = (CachedOutputStream) > > message.getContent(OutputStream.class); > > // FileOutputStream fileOut = new > > FileOutputStream("D:\\test.txt"); > > // CachedOutputStream.copyStream(csnew.getInputStream(), > > fileOut, 1024); > > > > StringBuilder sb = new StringBuilder(); > > csnew.writeCacheTo(sb); > > > > String tmpXML = sb.toString(); > > System.out.println("#####OLD####" + tmpXML); > > while (tmpXML.indexOf("<ns2:")!=-1){ > > String subTmp = > > tmpXML.substring(tmpXML.indexOf("<ns2:")); subTmp = > > subTmp.substring(1, subTmp.indexOf(" ")); tmpXML = > > tmpXML.replaceAll(subTmp, subTmp.substring(4) + " " + > > > "xmlns=\"http://www.ibm.com/xmlns/db2/cm/api/1.0/schema\<http://www.ib > > >m.com/xmlns/db2/cm/api/1.0/schema/>" "); > > System.out.println("#####FIXED#######" + tmpXML); > > } > > > > InputStream in = new > > ByteArrayInputStream(tmpXML.getBytes()); > > > > BufferedOutputStream bos = new BufferedOutputStream(os); > > CachedOutputStream.copyStream(in, bos, 1024); > > > > cs.close(); > > in.close(); > > // fileOut.close(); > > bos.close(); > > os.flush(); > > > > message.setContent(OutputStream.class, os); > > } catch (IOException ioe) { > > ioe.printStackTrace(); > > } > > } > > > > But the above code can't handle the message stream with MTOM > > attachements. It can't get the OutputStream at all. I don't know the > > reason. > > > > Your help will be really appreciated. Thanks in advance! > > Yuval Zou > > > > > -- > J. Daniel Kulp > Principal Engineer, IONA > [EMAIL PROTECTED] > http://www.dankulp.com/blog >
