微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JAX-WS 的简单使用

1、定义Service

Jax-wsWebService定义是通过注解进行的,我们必须在其WebService类的接口上使用@WebService注解进行标记

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface IWebService {

	@WebMethod
	public void calData(@WebParam(name = "num") int num);

	@WebMethod
	public String getString(@WebParam(name = "message") String message);
}

@WebService的其它注解属性可以获取认值,@WebParam 可以使XML生成的参数名更直观,此处加了@WebParam之后,在客户端写接口的时候也需要加上

实现webService的接口:

@WebService(endpointInterface = "test.interfaces.IWebService")
public class WebServiceImpl implements IWebService {

	@Override
	public void calData(int num) {
		int data = 0;
		for (int i = 0; i < num + 1; i++) {
			data = num + data;
		}
		System.err.println("运行结果为  " + data);

	}

	@Override
	public String getString(String message) {
		if (message == null || "".equals(message)) {
			return null;
		} else {
			return "the message is :" + message;
		}
	}
}
实现类中需要指定实现接口的路径 @WebService(endpointInterface = "test.interfaces.IWebService")

2、服务端发布WebService

	private final static String ADDRESS = "http://127.0.0.1:8899/test/webservice";

	public static void main(String[] args) {

		IWebService service = new WebServiceImpl();
		Endpoint.publish(ADDRESS,service);
	}

发布完之后访问路径 http://127.0.0.1:8899/test/webservice?wsdl,可以看到
       <deFinitions targetNamespace="http://impl.test/" name="WebServiceImplService">
            <import namespace="http://interfaces.test/"
                location="http://127.0.0.1:8899/test/webservice?wsdl=1" />
            <binding name="WebServiceImplPortBinding" type="ns1:IWebService">
                <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
                    style="rpc" />
                <operation name="getString">
                    <soap:operation soapAction="" />
                    <input>
                        <soap:body use="literal" namespace="http://interfaces.test/" />
                    </input>
                    <output>
                        <soap:body use="literal" namespace="http://interfaces.test/" />
                    </output>
                </operation>
                <operation name="calData">
                    <soap:operation soapAction="" />
                    <input>
                        <soap:body use="literal" namespace="http://interfaces.test/" />
                    </input>
                    <output>
                        <soap:body use="literal" namespace="http://interfaces.test/" />
                    </output>
                </operation>
            </binding>
            <service name="WebServiceImplService">
                <port name="WebServiceImplPort" binding="tns:WebServiceImplPortBinding">
                    <soap:address location="http://127.0.0.1:8899/test/webservice" />
                </port>
            </service>
        </deFinitions>
因为是实现的接口,所以继续访问http://127.0.0.1:8899/test/webservice?wsdl=1,可以看到具体的方法方法的参数
 
         <deFinitions targetNamespace="http://interfaces.test/">
            <types />
            <message name="getString">
                <part name="message" type="xsd:string" />
            </message>
            <message name="getStringResponse">
                <part name="return" type="xsd:string" />
            </message>
            <message name="calData">
                <part name="num" type="xsd:int" />
            </message>
            <message name="calDataResponse" />
            <portType name="IWebService">
                <operation name="getString" parameterOrder="message">
                    <input message="tns:getString" />
                    <output message="tns:getStringResponse" />
                </operation>
                <operation name="calData" parameterOrder="num">
                    <input message="tns:calData" />
                    <output message="tns:calDataResponse" />
                </operation>
            </portType>
        </deFinitions>

3、客户端访问WebService

  对于非本服务访问该WebService,需要重新定义一个接口,此处注解的@WebService 需要指定 targetNamespace,为http://127.0.0.1:8899/test/webservice?wsdl=1中生成的XML的targetNamespacetargetNamespace也可以在服务端指定;

@WebService(targetNamespace = "http://interfaces.test/")
public interface ILocalWebService {

	@WebMethod
	public void calData(@WebParam(name = "num") int num);

	@WebMethod
	public String getString(@WebParam(name = "message") String message);

}
 在使用Jax-ws时我们可以通过JaxWsProxyfactorybean来访问服务
	public static void main(String[] args) {
		JaxWsProxyfactorybean jwpFactory = new JaxWsProxyfactorybean();
		jwpFactory.setAddress("http://127.0.0.1:8899/test/webservice?wsdl");
		jwpFactory.setServiceClass(ILocalWebService.class);
		ILocalWebService hw = (ILocalWebService) jwpFactory.create();
		hw.calData(29);
	}

  也可以使用Service来访问服务

    public static void main(String[] args) {
        try {
            URL url= new URL("http://127.0.0.1:8899/test/webservice?wsdl");
            // Qname qname是qualified name 的简写
            // 2.构成:由名字空间(namespace)前缀(prefix)以及冒号(:),还有一个元素名称构成
            // 由发布的wsdl可知namespace为  http://impl.test/
            QName sname = new QName("http://impl.test/","WebServiceImplService");
            Service service = Service.create(url,sname);
            // 获取Service对应的port,从wsdl中获取的
            QName pname = new QName("http://impl.test/","WebServiceImplPort");
            ILocalWebService pservice = service.getPort(pname,ILocalWebService.class);
            pservice.calData(29);
        } catch (MalformedURLException e) {
            e.printstacktrace();
        }
    }

4、异常处理

 (1)、服务端发布WebService时报错 runtime modeler error: Wrapper class test.interfaces.jaxws.GetString is not found. Have you run APT to generate them?

   需要在WebService注解下加上 @SOAPBinding(style = SOAPBinding.Style.RPC)

 (2)、客户端访问WebService时报错 java.lang.NoClassDefFoundError: org/apache/ws/commons/schema/utils/NamespacePrefixList

    客户端使用 JaxWsProxyfactorybean 访问远程WebService时,需要添加额外的jar包,XmlSchema-1.4.7.jar和 wsdl4j-1.6.2.jar。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐