3

I'm using WSO2 EI ver 6.6.0 , and I developed a mediator which is responsible for Signing SOAP Envelopes.

The code I'm using correctly works on Java SE, and I've tested it. But when I compile it and deploy it on the WSO2 EI, it's not working.

The code has been thrown from this part of the code.

private static Document sign(Document doc, String Reference) throws Exception {
    DOMSignContext dsc = null;
    String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI");
    Provider provider = (Provider) Class.forName(providerName).newInstance();

    // Below line throw exception!
    XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", provider);

    .
    .
    .
    return doc;
}

Error

java.lang.ClassCastException: class org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory cannot be cast to class javax.xml.crypto.dsig.XMLSignatureFactory (org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory is in module java.xml.crypto of loader 'platform'; javax.xml.crypto.dsig.XMLSignatureFactory is in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @657e3cda)
        at javax.xml.crypto.dsig.XMLSignatureFactory.findInstance(XMLSignatureFactory.java:202)
        at javax.xml.crypto.dsig.XMLSignatureFactory.getInstance(XMLSignatureFactory.java:250)
        at x.signer.util.Utils.sign(Utils.java:246)
        at x.signer.util.Utils.insertSignSoap(Utils.java:233)
        at x.signer.util.Utils.insertSignSayad(Utils.java:197)
        at x.signer.Signer.mediate(Signer.java:37)
        at org.apache.synapse.mediators.ext.ClassMediator.mediate(ClassMediator.java:94)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:109)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71)
        at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
        at org.apache.synapse.rest.Resource.process(Resource.java:331)
        at org.apache.synapse.rest.API.process(API.java:441)
        at org.apache.synapse.rest.RESTRequestHandler.apiProcess(RESTRequestHandler.java:135)
        at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:113)
        at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:71)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:327)
        at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:98)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
        at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:368)
        at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:427)
        at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:182)
        at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:834)

Example of input

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <InquiryCode xmlns="http://tempuri.org/">
            <RequestCode>12345</RequestCode>
        </InquiryCode>
    </S:Body>
</S:Envelope>

I searched lots of similar issues and Stackoverflow questions, but most of them are unanswered, or the answered ones are not working for me like this one:

https://groups.google.com/g/fusefabric/c/1no0A5akFag

How to fix ClassCastException when XMLSignatureFactory used in a WSO2-AM Mediator?

S. Hesam
  • 5,266
  • 3
  • 37
  • 59
hesam
  • 31
  • 3

1 Answers1

0

Bundle the required javax.xml.crypto class jar inside the class mediator.

To do this, you must create a class mediator as an OSGI bundle rather than a jar file. If you have the following in your class mediator project pom.xml file;

<packaging>jar</packaging>

Change this to;

<packaging>bundle</packaging>

Following that, bundle the javax.xml.crypto class jar to the class mediator. To do this, add the following to the class mediator pom.xml file under maven-bundle-plugin as shown below.

<plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <version>3.5.0</version>
        <extensions>true</extensions>
        <configuration>
          <instructions>
       -----------


       -----------------------
        <Import-Package>
              *; resolution:=optional
          </Import-Package>
          <Embed-Dependency>
        javax.xml.crypto.dsig
          </Embed-Dependency>
          <Embed-Transitive>true</Embed-Transitive>
      </instructions>
    </configuration>
  </plugin>

Now build the class mediator and add the created jar file /dropins folder. Make sure you remove the previous class mediator jar from both /lib and /dropins folder.

Restart the server after adding the class mediator.

Nadun Kulatunge
  • 1,567
  • 2
  • 20
  • 28
  • Thanks Nadun for your answer, I've done step by step what you said multiple time. But still get the same error. Do you have any other opinion? – hesam Nov 10 '22 at 11:43