Java、JAX-WS我不明白wsimport生成的类是什么

Java、JAX-WS我不明白wsimport生成的类是什么,java,web-services,jakarta-ee,soap,jax-ws,Java,Web Services,Jakarta Ee,Soap,Jax Ws,我在理解wsimport工具从JAX-WSAPI为客户端应用程序生成的3个类时遇到一些问题 使用@WebService创建类,如下所示: @WebService public class HelloService { @WebMethod public String sayHelloTo(String name) { return "Hello " + name; } } 我按代码发布它: Endpoint.publish(address, ne

我在理解wsimport工具从JAX-WSAPI为客户端应用程序生成的3个类时遇到一些问题

使用@WebService创建类,如下所示:

@WebService
public class HelloService
{
    @WebMethod
    public String sayHelloTo(String name)
    {
        return "Hello " + name;
    }
}
我按代码发布它:

Endpoint.publish(address, new HelloService());
当我通过wsimport生成客户端存根时,如下所示:

wsimport -p client.hello -keep -Xnocompile http://localhost/service-name?wsdl 
我得到的文件如下:

 HelloService.java
 HelloServiceService.java
 ObjectFactory.java
 package-info.java
 SayHelloTo.java
 SayHelloToResponse.java
问题是我不明白,我找不到关于类的答案:ObjectFactory,SayHelloTo,sayHellotResponse。我不明白,因为当我删除这些文件时,客户端应用程序工作正常。首先,我认为JAX-WS引擎正在使用它来生成SOAPMessage,但当我删除它并运行客户端应用程序时,我突然想到了这一点

客户端代码尽可能简单:

public class Main
{
    public static void main(String[] args) throws Exception
    {
        HelloServiceService service = new HelloServiceService();
        HelloService helloService = service.getHelloServicePort();


        System.out.println(helloService.sayHelloTo("Adam"));
    }
}

也许您需要更多地了解WSDL代表什么以及它的各个部分

  • SayHelloTo
    sayHellotResponse
    对应于请求/响应消息定义。 (必须使用适当的XSD定义将它们放在那里) 只要你的代码不使用它们,没有它们的代码就可以工作

  • HelloServiceService
    在您的例子中,它是WSDL中服务定义中的WebService存根(这就是为什么wsimport在名称后面加上“service”)

  • HelloService
    是从WSDL绑定端口存根,您可以通过调用 'getHelloServicePort();'

  • ObjectFactory
    是JAXB可选的助手类,它具有根据XSD定义创建对象新实例的方法。使用它比使用
    SayHelloTo request=new SayHelloTo();

顺便说一句 这不是完整的答案,我想我错过了更多的细节…但也许这会帮助你开始

UPD: 看看你的WSDL,一定有这样的东西(不一定是必需的,但有点)

不使用这些类,因此当您手动删除它们时,不会发生任何事情


至少这是我对它的理解…

谢谢你的回答。你是否可以更详细地解释这一部分:“SayHelloTo和SayHellotResponse对应于请求/响应消息定义。(你必须在那里有相应的XSD定义)我知道什么是XSD for WSDL文件,所以您必须解释这一点,我知道类是这个XSD模式的映射。
<service name="HelloService">
  <port name="HelloService" ...>
    ...
  </port>
</service>

<portType name="HelloService">
  <operation name="sayHelloTo">      
    <input name="sayHelloTo" message="tns:sayHelloTo" />
    <output name="sayHelloToResponse" message="tns:sayHelloToResponse" />
  </operation>
</portType>

<message name="sayHelloTo">
  <part name="RequestMessage" element="SayHelloTo" />
</message>
<message name="sayHelloToResponse">
  <part name="ResponseMessage" element="SayHelloToResponse" />
</message>
<xsd:element name="SayHelloTo" type="{some type definition}"/>
<xsd:element name="SayHelloToResponse" type="{some type definition}"/>
@WebMethod
public String sayHelloTo(String name)
{
    return "Hello " + name;
}