Best way to consume RPC/encoded webservice?
Asked Answered
P

3

38

I need to consume old-school RPC/encoded WSDL webservice for my backend. At first I tried to use Apache CXF and JAX-WS for that, but JAX-WS wsimport tool doesn't eat rpc/enoded WSDL.

[ERROR] rpc/encoded wsdls are not supported in JAXWS 2.0.

I'm also in doubt about using JAX-RPC for this job, because it's way out-dated. Axis 1.4 is 5 years old tool.

Currently I see these three options:

  1. use JAX-WS javax.xml.ws.Dispatch to send and receive SOAP and parse it somehow, one example
  2. use JAX-RPC and gain bad karma for using outdated technology,
  3. do it all manually and hate myself later.

Neither of these sound too good, so I would appreciate if you could give some good leads, thought what to do and how to solve it.

Preece answered 2/9, 2011 at 13:28 Comment(1)
I've seen that link before. This solution contains using static XML, which is option 1. Solution, but not very elegant one.Preece
P
27

UPDATE

My case was solved with hand editing WSDL from encoded to literal (basically under operations input and output use="literal" was the only replacement) and then I could generate stubs with Apache CXF. It could be done, because endpoint wasn't parsing RPC/encoded exactly and RPC/encoded spec XML couldn't be validated against WSDL).

Although Axis 1.4 may work for you, using Apache CXF with that little WSDL hack, may be a better way.


[Old answer]

For reference -- I opted for using JAX-RPC and Axis 1.4 this time. I generated client code and hopefully can replace it with JAX-WS implementation when service gets upgraded.

Preece answered 6/9, 2011 at 13:11 Comment(2)
I did download the axis 1.4 but cannot generate the stubs. Do you have any idea where the documentation of wsdl2java is? I tried on apache site but found nothing interesting.Hussy
If you are able to edit WSDL as I pointed out in my first post EDIT part, then you are good to go with more up to date tools like Apache CXF. Confirm it before you go with Axis 1.4, as these tools should avoided if able.Preece
E
1

In case someone would like (well, "like" is not the right word here ;-) to use Axis 1.4, here is a maven plugin that can generate appropriate classes and Port interface.

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>axistools-maven-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                    <configuration>
                        <!-- Use your .wsdl location here-->
                        <sourceDirectory>${basedir}/src/main/resources/wsdl</sourceDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<!-- Here the libraries that you need to call the Axis WS client -->
<dependencies>
    <dependency>
        <groupId>org.apache.axis</groupId>
        <artifactId>axis</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.axis</groupId>
        <artifactId>axis-jaxrpc</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>commons-discovery</groupId>
        <artifactId>commons-discovery</artifactId>
        <version>0.5</version>
    </dependency>
    <dependency>
        <groupId>axis</groupId>
        <artifactId>axis-wsdl4j</artifactId>
        <version>1.5.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.axis</groupId>
        <artifactId>axis-saaj</artifactId>
        <version>1.4</version>
    </dependency>
    <!-- activation+mail: To stop Axis generating WARNING about "Attachment support being disabled" -->
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
    </dependency>
</dependencies>
Enamour answered 22/11, 2018 at 13:23 Comment(2)
What command to I need to run to execute the sources?Kwei
That is beyond the scope of this answer. The xml above is a part of maven build file. You need to get familiar with mavenEnamour
G
0

I have the same problem with a WS RPC style, I have a springboot project with eclipse and java 1.8 and this... WS from a provider(It means that I can't change the published wsdl).

If you're using springboot I 'm using the org.codehaus.mojo plugin to generate the sources and works.

  1. store your wsdl in local (I put it in the root of my spring project Myspringproyectfolder/wsdl/servicio.wsdl)
  2. In the WSDL change all the text from use="encoded" to use="literal" as the upper response says
  3. Change in the POM plugin attributes the to the local WSDL modified instead of the original WSDL URL.

pom.xml

<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxws-maven-plugin</artifactId>
        <version>2.6</version>
        <executions>
            <execution>
            <id>wsimport-from-jdk</id>
            <goals>
                <goal>wsimport</goal>
            </goals>
            </execution>
        </executions>
        <configuration>
            <wsdlUrls>
            <wsdlUrl>wsdl/servicio.wsdl</wsdlUrl>
    
            </wsdlUrls>
            <keep>true</keep>
            <packageName>com.cbb.facturalo.wsclient.generated</packageName>
            <sourceDestDir>src/main/java</sourceDestDir>
        </configuration>
    </plugin>

4.- run the maven/install to generate the sources, port type, object factory, etcetc.

Gypsy answered 28/4, 2022 at 3:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.