调用WSDL文件的两种方法(非动态和动态)


<jaxws:endpoint
id="xxWebService"
implementor="#firstCxfService"
address="/xxWebService" />


[color=red][b]别忘了address中的 / 非常重要[/b][/color]


package com.controller;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

import com.webservice.FirstCxfService;
import com.webservice.bo.TestBo;

/**
* @author:
* @TODO:动态wsdl文件
*/
public class CxfClient {
private static final String WSDL_URL = "http://localhost:8080/RestFulServer/services/xxWebService?wsdl";

public static void main(String[] args) {
// 第一种方式需要客户端生成wsdl对应的java文件 (非动态)
JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
// 获取服务器端
factoryBean.setAddress(WSDL_URL);
// 通过客户端的接口获取服务器端的接口
factoryBean.setServiceClass(FirstCxfService.class);
FirstCxfService hello = (FirstCxfService) factoryBean.create();
System.out.println(hello.sayHello(2));
TestBo testBo = hello.getTestBo("lau");
System.out.println(testBo.getName());

// 第二种方式 不需要wsdl文件生成java文件 (动态)
try {
JaxWsDynamicClientFactory dynamicClientFactory = JaxWsDynamicClientFactory
.newInstance();
Client client = dynamicClientFactory
.createClient(WSDL_URL);
// 第一个参数是方法名 第二个参数是方法对应的参数值
Object[] objects = client.invoke("sayHello", 2);
System.out.println(objects[0].toString());
objects = client.invoke("getTestBo", "lau");
//得到对象所封装的值
System.out.println(objects[0].getClass().getMethod("getName").invoke(objects[0]));
} catch (Exception e) {
e.printStackTrace();
}
}
}



[color=red]如果动态调用出差则可能由下面的原因导致[/color]
1.[color=red]注意:如果使用动态调用wsdl文件则应该在定义webService时指定命名空间
命名空间的值与wsdl文件中的命名空间想对应
[/color]
2.产生的原因是没有获得编译环境,[color=blue]也就是JRE设置的问题,[/color][b][size=medium][color=red]需要在eclipse里面把jre设置为jdk下的jre。[/color][/size][/b]

package com.webservice.impl;

import javax.annotation.Resource;
import javax.jws.WebService;

import com.dwr.Test;
import com.dwr.TestDAO;
import com.webservice.FirstCxfService;
import com.webservice.bo.TestBo;
//指定命名空间targetNamespace
@WebService(targetNamespace = "http://webservice.com/",
endpointInterface = "com.webservice.FirstCxfService")
public class FirstCxfServiceImpl implements FirstCxfService {

@Resource
private TestDAO testDAO;

@Override
public int sayHello(int id) {
Test test = new Test();
test.setId(id);
return this.testDAO.getCount(test);
}

@Override
public TestBo getTestBo(String name) {
TestBo testBo = new TestBo();
testBo.setName(name);
return testBo;
}
}



[color=blue]WSDL文件中的wsdl:definitions标签下的targetNamespace属性值对应[/color]



<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://webservice.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="FirstCxfServiceImplService" targetNamespace="http://webservice.com/">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://webservice.com/" elementFormDefault="unqualified" targetNamespace="http://webservice.com/" version="1.0">
<xs:element name="getTestBo" type="tns:getTestBo"/>
<xs:element name="getTestBoResponse" type="tns:getTestBoResponse"/>
<xs:element name="sayHello" type="tns:sayHello"/>
<xs:element name="sayHelloResponse" type="tns:sayHelloResponse"/>
<xs:complexType name="sayHello">
<xs:sequence>
<xs:element name="arg0" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="sayHelloResponse">
<xs:sequence>
<xs:element name="return" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getTestBo">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getTestBoResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="tns:testBo"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="testBo">
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="sayHelloResponse">
<wsdl:part element="tns:sayHelloResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="sayHello">
<wsdl:part element="tns:sayHello" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getTestBo">
<wsdl:part element="tns:getTestBo" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getTestBoResponse">
<wsdl:part element="tns:getTestBoResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="FirstCxfService">
<wsdl:operation name="sayHello">
<wsdl:input message="tns:sayHello" name="sayHello">
</wsdl:input>
<wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getTestBo">
<wsdl:input message="tns:getTestBo" name="getTestBo">
</wsdl:input>
<wsdl:output message="tns:getTestBoResponse" name="getTestBoResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="FirstCxfServiceImplServiceSoapBinding" type="tns:FirstCxfService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getTestBo">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="getTestBo">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getTestBoResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="sayHello">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="sayHello">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="sayHelloResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="FirstCxfServiceImplService">
<wsdl:port binding="tns:FirstCxfServiceImplServiceSoapBinding" name="FirstCxfServiceImplPort">
<soap:address location="http://localhost:8080/RestFulServer/services/xxWebService"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值