消费RPC/编码的Web服务的最佳方法是什么?

38

我需要调用旧式的RPC/编码WSDL Web服务来处理后端。起初尝试使用Apache CXF和JAX-WS,但是JAX-WS wsimport工具无法解析rpc/enoded WSDL。

[ERROR] rpc/encoded wsdls不受JAXWS 2.0支持。

我也在怀疑是否应该使用JAX-RPC来完成此任务,因为它已经过时了。Axis 1.4是5年前的工具。

目前我看到有以下三个选项:

  1. 使用JAX-WS javax.xml.ws.Dispatch发送和接收SOAP,并以某种方式进行解析,这是一个例子
  2. 使用JAX-RPC并因使用过时技术而被扣上坏的业力,
  3. 全部手动完成,之后讨厌自己。

没有一个听起来太好,所以如果您能给出一些好的建议,思路和如何解决它,我将不胜感激。


我以前见过那个链接。这个解决方案包含使用静态XML,这是选项1。但这并不是非常优雅的解决方案。 - ilvez
3个回答

27

更新

我的问题得到解决,通过手动编辑WSDL文件中的encoded标记为literal标记(主要是在操作输入和输出中,只需要将use="literal"替换即可),随后使用Apache CXF生成存根。这样做是可行的,因为终端点并没有完全解析RPC/encoded,且RPC/encoded规范XML不能针对WSDL进行验证。

虽然Axis 1.4可能适用于您,但使用带有少量WSDL修改的Apache CXF可能是更好的选择。


[旧答案]

供参考--我此次选择使用JAX-RPC和Axis 1.4。我生成了客户端代码,并希望在服务升级时可以将其替换为JAX-WS实现。


2
我已经下载了Axis 1.4,但无法生成存根。你知道wsdl2java的文档在哪里吗?我在Apache网站上尝试过,但没有找到有趣的内容。 - рüффп
如果您能够像我在第一篇帖子的编辑部分所指出的那样编辑WSDL,那么您可以使用更新的工具,如Apache CXF。在使用Axis 1.4之前,请确认一下,因为如果可能的话,应该避免使用这些工具。 - ilvez

1

如果有人想使用Axis 1.4,这里有一个可以生成适当类和端口接口的Maven插件。

<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>

我需要运行哪个命令来执行这些源代码? - csskevin
这超出了本答案的范围。上面的 XML 是 Maven 构建文件的一部分。您需要熟悉 Maven - Foyta

0

我也遇到了一个WS RPC风格的问题,我有一个使用eclipse和java 1.8的springboot项目,需要从提供者那里获取WS(这意味着我无法更改发布的wsdl)。

如果您正在使用springboot,则可以使用org.codehaus.mojo插件生成源代码并运行。

  1. 将wsdl存储在本地(我将其放在我的spring项目Myspringproyectfolder / wsdl / servicio.wsdl的根目录中)
  2. 在WSDL中将所有文本从use =“encoded”更改为use =“literal”,如上面的响应所述
  3. 在POM插件属性中将更改为修改后的本地WSDL,而不是原始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. 运行maven/install以生成源代码、端口类型、对象工厂等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接