2

我们有一些现有的 Java 代码在 Tomcat 服务器上运行,我们希望允许另一台机器上的代码执行,因此我们正在研究 Web 服务。我是网络服务的新手,我想我可能在这里做错了什么。

我遵循了一些关于如何在 Tomcat 中部署 JAX-WS Web 服务的在线教程。我创建了一个 Web 服务类并使用 @WebService 对其进行注释,编写了一个 web.xml 和 sun-jaxws.xml 文件,将这些文件(加上 JAX-WS jar 文件)打包到一个 .war 文件中,并将其部署到 Tomcat . 这似乎有效,因为我可以在指向 Tomcat 的浏览器中加载 WSDL 文件。

这是我遇到问题的网络服务客户端。首先,服务器端有现有的类可以映射到数据库中。我们希望允许客户端使用相同的现有类并从中创建实例,调用 Web 服务,然后将对象存储到数据库中。但是,当我对服务器的 WSDL 文件运行 wsimport 命令时,它生成了一堆 Java 类,其中很多与我们现有的类相似。我想我们必须使用那些而不是我们现有的类?代码重用就这么多,除非我很困惑,这是很有可能的。

所以现在我已经使用 wsimport 生成的那些类编写了客户端。但是我遇到了编译错误。我们现有 Java 类中的一些字段是 java.net.InetAddress 类型的。但由于某种原因,wsimport 生成了自己的 InetAddress 类,它看起来是这样的:

package ems.server.webservices;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "inetAddress")
public class InetAddress {
}

是的,这只是一堂课,里面什么都没有!所以我说的很多编译错误:

WSClient.java:37: setAddress(ems.server.webservices.InetAddress) in ems.server.webservices.NetworkAddress cannot be applied to (java.net.InetAddress)
    networkAddress.setAddress(InetAddress.getByName("1.1.1.1"));

我正在尝试创建一个 java.net.InetAddress,但它希望我使用由 wsimport 生成的空类。我一定在这里做错了什么。请赐教。

4

1 回答 1

2

我们有一些现有的 Java 代码在 Tomcat 服务器上运行,我们希望允许另一台机器上的代码执行,因此我们正在研究 Web 服务

网络服务为此?为什么?

首先,服务器端有现有的类可以映射到数据库中。我们希望允许客户端使用那些相同的现有类....对于代码重用来说太多了

真是个坏主意。Web 服务的目的不是代码可重用性,而是互操作性。尝试重用实际承载您正在使用的编程语言的语义的业务类,不仅是一种不好的做法,而且会导致您遇到许多问题,除非您还控制客户端的大多数微不足道的 Web 服务。

当我对服务器的 WSDL 文件运行 wsimport 命令时,它生成了一堆 Java 类

当您运行wsimportWeb 服务客户端与 Web 服务器通信所需的所有必要工件时,就会创建。这包括所有有助于在 SOAP 编组/解组期间转换类的存根类

但是我遇到了编译错误。我们现有 Java 类中的一些字段是 java.net.InetAddress 类型的

java.net.InetAddressJava 特定的类。你不应该首先暴露它。这就是代码生成器创建空的java.net.InetAddress.

老实说,我不能给你一个直接的答案来完成这项工作。我唯一可以给你的提示是,如果你用它们注释InetAddress字段,@XmlTransient它们将不会被暴露WSDL,你就不会遇到这个问题。当然,你没有说你是否需要这个字段,也许我的建议对你没有用。

但我的建议是改变你的方法。恕我直言,您走错了路。唯一的建议是改变你的方法。

于 2012-05-04T16:51:04.260 回答