You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Dmitriev Vadim <dm...@mail.ru> on 2012/04/08 17:32:10 UTC

Running CXF+WSS4J on Weblogic

Hi!

I'm trying to create WS-S enabled service based on CXF to run inside 
WebLogic container. Currently I got stuck at overriding custom weblogic 
classes related to XML processing. Sadly, this certified enterprise 
bla-bla-bla server doesn't ship level 3 DOM and many other JVM XML 
services required for WSS4J (and Apache Santuario underneath it) to run.

First, XMLInputFactory shipped with WL eventually created half-working 
DOM that was failing when both WSS4JInInterceptor was installed and 
schema-validation-enabled was set to "true" on the endpoint:
java.lang.AssertionError: UNIMPLEMENTED
     at weblogic.xml.domimpl.NodeImpl.getUserData(NodeImpl.java:488)
     at 
org.apache.cxf.staxutils.W3CDOMStreamReader.getLocation(W3CDOMStreamReader.java:408)
     at 
org.apache.cxf.staxutils.DepthXMLStreamReader.getLocation(DepthXMLStreamReader.java:110)
     ...

Ok, got around it by specifying javax.xml.stream.XMLInputFactory on the 
endpoint:
<entry key="javax.xml.stream.XMLInputFactory">
<bean class="com.ctc.wstx.stax.WstxInputFactory"/>
</entry>

Figure two: now I'm getting
java.lang.AssertionError: UNIMPLEMENTED
     at 
weblogic.xml.domimpl.ElementBase.setIdAttributeNode(ElementBase.java:333)
     at 
org.apache.jcp.xml.dsig.internal.dom.DOMKeyInfo.<init>(DOMKeyInfo.java:94)
     at 
org.apache.jcp.xml.dsig.internal.dom.DOMXMLSignature.<init>(DOMXMLSignature.java:150)
...

There is a workaround for this problem too by setting system property 
"org.apache.cxf.binding.soap.messageFactoryClassName" to JVM's own 
MessageFactory. Though it works, this solution has downsides:
1. it is set for the whole JVM, not CXF instance. It can have 
unpredictable effects on the other CXF apps installed on the same app 
server;
2. this property is not per SOAP version. So if I set it to SOAP 1.1 
MessageFactory, SOAP 1.2 may stop working.

I wanted to fix these issues before going production. My initial attempt 
was to define impl classes for both SOAP 1.1 and 1.2 message factories 
in SoapMessage contextual properties and cache instantiated objects in 
o.a.c.binding.soap.saaj.SAAJFactoryResolver. Now that I described source 
of the problems, is my approach proper from architectural POV? Is it 
worth filing an enhancement ticket for this?

Thanks!

P.S. They do really love "AssertionError("UNIMPLEMENTED")" there at 
BEA/Oracle.
P.P.S. Sorry for all there emotions, but I'm very very tired of this app 
server.