java - 对网络服务的困惑

标签 java web-services jax-ws wsimport

我们有一些现有的 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 生成的空类。我一定是在这里做错了什么。请赐教。

最佳答案

We have some existing Java code running on a Tomcat server that we want to allow code on another machine to execute, so we are looking into web services

这方面的网络服务?为什么?

First of all, there are existing classes on the server side that get mapped into a database. We want to allow the client to use those same existing classes....So much for code reuse

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

when I ran the wsimport command against the server's WSDL file, it generated a bunch of Java classes

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

But I'm getting compile errors. Some of the fields in our existing Java classes are of type java.net.InetAddress

java.net.InetAddress 是一个Java 特定类。你一开始就不应该暴露这一点。这就是代码生成器创建空的 java.net.InetAddress 的原因。

说实话,我无法直接回答您如何完成这项工作。我唯一可以给您的提示是,如果您使用 @XmlTransient 注释 InetAddress 字段,它们将不会在 WSDL 中公开,并且您也不会有这个问题。当然,你不说你是否需要这个字段,所以,也许我的建议对你来说没有用。

但我的建议是改变你的方法。恕我直言,你走在错误的道路上。 唯一的建议是改变你的方法。

关于java - 对网络服务的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10452328/

相关文章:

java - 是否可以将匿名类从 Java 转换为 JRuby?

java - 如何使 JavaFx 中的 TableView 响应式?

jquery - PhoneGap getJSON 调用 REST 服务不起作用

java - WebService下载后删除文件

web-services - 贾克斯WS : Externalize Http Conduit name Attribute

java - Joda-Time 中的排序间隔

java - 用于配置的 Web UI 框架

java - CXF选择性服务曝光

java - Salesforce SOAP 连接命名空间问题

java - Java Web 服务中的单例对象