关于Web服务的困惑

时间:2012-05-04 16:04:06

标签: java web-services jax-ws wsimport

我们在Tomcat服务器上运行一些现有的Java代码,我们希望允许其他机器上的代码执行,因此我们正在研究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生成的空类。我一定是在做错事。请赐教。

1 个答案:

答案 0 :(得分:2)

  

我们在Tomcat服务器上运行了一些现有的Java代码   想让其他机器上的代码执行,所以我们正在寻找   进入网络服务

为此提供Web服务?为什么?

  

首先,服务器端有现有的类   映射到数据库。我们希望允许客户端使用它们   现有的类......代码重用非常多

真的很糟糕。 Web服务的目的不是代码可重用性,而是互操作性。尝试重用实际上带有您正在使用的编程语言语义的业务类不仅是一种不好的做法,而且可能会导致许多问题,除非您还控制客户端的大多数琐碎的Web服务。

  

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

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

  

但是我收到了编译错误。我们现有的一些领域   Java类的类型为java.net.InetAddress

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

说实话,我不能直接回答你做这项工作。我唯一可以提示的是,如果您使用InetAddress注释@XmlTransient字段,则WSDL中不会显示这些字段,您就不会遇到此问题。当然,你没有说你是否需要这个领域,也许我的建议对你没用。

但我的推荐是改变你的做法。你是错误的道路恕我直言。 唯一的推荐是改变你的方法。