新手村菜鸟 2017-05-11 09:43 采纳率: 0%
浏览 608

如何使用jax-ws APIs 实现webservice client

String wsdlUrl="http://localhost:8080/springmvc/services/helloWebService?wsdl";
QName serviceName=new QName("http://springmvc.com/","helloWebService");
Service service=Service.create(serviceName);
service.addPort(serviceName, javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING,wsdlUrl);
Dispatch dispatch=service.createDispatch(serviceName,SOAPMessage.class,Service.Mode.MESSAGE);
MessageFactory messageFactory=MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);

    SOAPMessage request=messageFactory.createMessage();
    SOAPPart part=request.getSOAPPart();

    SOAPEnvelope soapEnvelope=part.getEnvelope();
    SOAPHeader header=soapEnvelope.getHeader();
    SOAPBody body=soapEnvelope.getBody();

    SOAPElement operation=body.addChildElement("hello","nsl","http://springmvc.com/");
    SOAPElement value=operation.addChildElement("name");
    value.addTextNode("a");
    request.saveChanges();

    SOAPMessage response=dispatch.invoke(request);

    System.out.println(response.getSOAPBody());


            这是参考官方文档写的,但并不能成功调用webservice 接口。希望是使用jax-ws APIs代码的方式调用,而不是wsimport自动生成代码

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-05 21:01
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    要使用Java和JAX-WS来创建一个简单的Web服务客户端应用程序,请按照以下步骤操作:

    1. 添加必要的依赖:首先确保你的项目中包含了JAX-WS的依赖。这可以通过添加maven依赖来完成。
    <dependency>
      <groupId>javax.xml</groupId>
      <artifactId>jaxws-api</artifactId>
      <version>2.2.4</version>
    </dependency>
    
    <dependency>
      <groupId>org.glassfish.jaxb</groupId>
      <artifactId>jaxb-runtime</artifactId>
      <version>2.3.1</version>
    </dependency>
    
    1. 创建一个XML Web服务定义文件(wsdl):

      • 在你的项目的src/main/resources目录下创建一个新的文件,例如HelloWorld.war.xml
      • 在这个文件中输入如下内容:
        <?xml version="1.0" encoding="UTF-8"?>
        <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
                          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                          targetNamespace="http://springmvc.com/"
                          xmlns:wss="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
          <wsdl:portType name="PersonPortType">
            <wsdl:operation name="sayHello">
              <wsdl:input name="request">
                <wsdl:element name="person"/>
              </wsdl:input>
              <wsdl:output name="response">
                <wsdl:element name="person"/>
              </wsdl:output>
            </wsdl:operation>
          </wsdl:portType>
          <wsdl:binding name="PersonBinding" type="PersonPortType">
            <wsdl:operation name="sayHello">
              <wsdl:input message="xsd:string"/>
              <wsdl:output message="xsd:string"/>
            </wsdl:operation>
          </wsdl:binding>
        </wsdl:definitions>
        
    2. 创建一个类来处理请求:

      • 在同一个目录下创建一个名为HelloServiceImpl.java的新Java文件,并编写以下代码:
        package com.example;
        
        import org.apache.cxf.Bus;
        import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Component;
        
        @Component
        public class HelloWorldServiceImpl implements HelloWorldService {
        
          private static final String SERVICE_URL = "http://localhost:8080/springmvc/services/helloWebService";
          private JaxWsProxyFactoryBean proxyFactoryBean;
        
          @Autowired
          public void setProxyFactoryBean(JaxWsProxyFactoryBean proxyFactoryBean) {
            this.proxyFactoryBean = proxyFactoryBean;
          }
        
          @Override
          public String sayHello(String person) {
            return (String) proxyFactoryBean.getObject().invoke(person);
          }
        }
        
    3. 创建一个Spring配置文件(applicationContext.xml)来注册我们的服务实例:

      • 在项目的根目录下创建一个名为applicationContext.xml的XML文件。
      • 将以下代码添加到此文件中:
        <!-- 注册我们的服务实例 -->
        <bean id="proxyFactoryBean" class="com.example.HelloWorldServiceImpl"/>
        
        <!-- 注册服务端点 -->
        <bean id="serviceEndpoint" class="com.example.HelloServiceImpl$ServiceEndpoint"/>
        
    4. 使用CXF(Concurrent Java XML Binding)来创建一个Web服务客户端应用:

      • 编写一个主方法并加载CXF配置,然后使用CXF创建代理对象。
      • 现在你可以使用你创建的服务端点进行调用了。
      • 以下是完整的示例代码:
        import javax.xml.namespace.QName;
        import javax.xml.rpc.Service;
        import javax.xml.ws.Endpoint;
        import javax.xml.ws.BindingProvider;
        import java.util.Properties;
        
        import org.apache.cxf.Bus;
        import org.apache.cxf.frontend.ClientProxy;
        import org.apache.cxf.frontend.ServerProxy;
        import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
        import org.apache.cxf.message.Message;
        import org.apache.cxf.phase.AbstractPhaseInterceptor;
        import org.apache.cxf.phase.PhaseDescription;
        import org.apache.cxf.transport.http.HTTPTransport;
        import org.apache.cxf.ws.security.SecurityManager;
        import org.apache.cxf.ws.security.WSSecurityManager;
        
        public class HelloWorldClient {
        
          private static final String SERVICE_URL = "http://localhost:8080/springmvc/services/helloWebService";
          private static final String SERVICE_NAME = "PersonPortType.sayHello";
          private static final String PERSON = "a";
          private static final String USER = "user";
          private static final String PASS = "password";
        
          public static void main(String[] args) throws Exception {
            // 初始化CXF配置
            Properties props = new Properties();
            props.put("cxf.endpoint-config", "endpoint-config.xml");
        
            Bus bus = new Bus(props);
            bus.setActive(true);
        
            // 创建一个安全的服务器代理
            ServerProxy serverProxy = new ServerProxy(bus, SERVICE_URL, null,
                 HTTPTransport.class.getName(), SecurityManager.class.getName());
        
            // 创建一个安全的客户端代理
            ClientProxy clientProxy = new ClientProxy(bus, serverProxy, SERVICE_NAME, null,
                 WSSecurityManager.class.getName());
        
            // 设置用户信息
            clientProxy.setProperty(BindingProvider.USERNAME_PROPERTY, USER);
            clientProxy.setProperty(BindingProvider.PASSWORD_PROPERTY, PASS);
        
            // 获取消息工厂
            MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
        
            // 创建一个SOAP消息
            SOAPMessage msg = messageFactory.createMessage();
        
            // 创建一个SOAP envelope
            SOAPEnvelope envelope = msg.getSOAPPart().getEnvelope();
        
            // 创建一个SOAP header
            SOAPHeader header = envelope.getHeader();
        
            // 创建一个SOAP body
            SOAPBody body = envelope.getBody();
        
            // 创建一个SOAP element
            SOAPElement operation = body.addChildElement("sayHello", "nsl",
                 "http://springmvc.com/", "");
            SOAPElement person = operation.addChildElement("person", "", "http://springmvc.com/",
                 "");
        
            person.setValue(PERSON);
        
            // 发送消息
            clientProxy.invoke(msg, operation);
        
            // 打印响应
            System.out.println(msg.getSOAPBody());
          }
        }
        
    5. 保存文件后运行程序。你应该能够看到从客户端发送的请求被正确地解析并返回给客户端。

    注意:以上代码示例仅供参考。实际使用时可能需要根据具体需求调整配置、错误处理等。

    评论

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境