#java #web-services #soap #wsdl
#java #веб-службы #soap #wsdl
Вопрос:
Я реализовал простой веб-сервис, в котором есть один метод, который принимает строку и возвращает сообщение, содержащее входной параметр.
package com.product.mobile.webapp.soap;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;
@WebService
@SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL, parameterStyle = ParameterStyle.WRAPPED)
public class WSHello {
@WebMethod
public String sayMyName(@WebParam(name = "name", mode = Mode.IN) String name) {
return "Hello, ... " name;
}
}
Я публикую эту конечную точку следующим образом:
WSHello wsHello = new WSHello();
String wsHelloEndpoint = "http://localhost:8080/hello";
Endpoint.publish(wsHelloEndpoint, wsHello);
При запуске приложения создается следующий WSDL, который доступен в http://localhost:8080/hello?wsdl
<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01. --><definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://soap.webapp.mobile.product.at/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://soap.webapp.mobile.product.at/" name="WSHelloService">
<types>
<xsd:schema>
<xsd:import namespace="http://soap.webapp.mobile.product.at/" schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>
</xsd:schema>
</types>
<message name="sayMyName">
<part name="parameters" element="tns:sayMyName"></part>
</message>
<message name="sayMyNameResponse">
<part name="parameters" element="tns:sayMyNameResponse"></part>
</message>
<portType name="WSHello">
<operation name="sayMyName">
<input wsam:Action="http://soap.webapp.mobile.product.at/WSHello/sayMyNameRequest" message="tns:sayMyName"></input>
<output wsam:Action="http://soap.webapp.mobile.product.at/WSHello/sayMyNameResponse" message="tns:sayMyNameResponse"></output>
</operation>
</portType>
<binding name="WSHelloPortBinding" type="tns:WSHello">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding>
<operation name="sayMyName">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal"></soap:body>
</input>
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
</binding>
<service name="WSHelloService">
<port name="WSHelloPort" binding="tns:WSHelloPortBinding">
<soap:address location="http://localhost:8080/hello"></soap:address>
</port>
</service>
</definitions>
На стороне клиента я могу получить доступ к своему веб-сервису, а также получить доступ к методу sayMyName(String name)
Моя проблема в том, что я не могу предоставить параметр name функции на клиенте. Я предполагаю, что сгенерированный WSDL неверен, поскольку он не содержит информации о параметрах.
Может кто-нибудь объяснить мне, что я здесь делаю не так, почему WSDL не содержит аргумента параметра?
Ответ №1:
Указанный вами параметр указан в атрибуте «schemaLocation». смотрите ниже.
<xsd:import namespace="http://soap.webapp.mobile.product.at/" schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>
Таким образом, вы можете проверить информацию о параметрах в «http://localhost:8080/hello?xsd=1 «.
Если вы хотите сгенерировать клиент для java из?wsdl,
wsimport -keep http://localhost:8080/hello?wsdl
вы знаете, что «-keep» означает «генерировать с исходным кодом»
Вы можете получить набор клиентского кода.
У меня есть другое предложение,
Если вы хотите включить XSD в WSDL, чтобы такие инструменты, как «birt», понимали WSDL,
Попробуйте сгенерировать WSDL со встроенными схемами (без schemeLocation), как показано ниже,
wsgen -cp . com.product.mobile.webapp.soap.WSHello -wsdl -inlineSchemas
Будет создан файл «WSHelloService.wsdl».
Отредактируйте аннотацию @WebService в классе WSHello, как показано ниже.
@WebService(wsdlLocation="WSHelloService.wsdl")
@SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL, parameterStyle = ParameterStyle.WRAPPED)
public class WSHello {
@WebMethod
public String sayMyName(@WebParam(name = "name", mode = Mode.IN) String name) {
return "Hello, ... " name;
}
}
Перезапустите сервер и получите доступ «http://localhost:8080/hello?wsdl » с помощью вашего инструмента.
надеюсь, это поможет.
Комментарии:
1. В основном я ищу доступ к моей веб-службе с помощью инструмента BIRT ( eclipse.org/birt ). Я вижу свой веб-сервис, а также метод в клиенте BIRT, но он не позволяет мне вводить какие-либо параметры.
2. Я обновил свой ответ. WSDL с включенным XSD может быть лучше для BIRT.
3. Спасибо за ваши предложения, вы правы. Я добился этого, используя другую привязку SOAP, как описано в моем ответе. Хорошего дня! 🙂
Ответ №2:
Итак, я наконец-то узнал, как заставить его работать, в основном я добавил следующую аннотацию в свой @WebService
класс:
@SOAPBinding(style = SOAPBinding.Style.RPC)
Полный пример:
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.BindingType;
@WebService
@BindingType(value = "http://java.sun.com/xml/ns/jaxws/2003/05/soap/bindings/HTTP/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class WSHello {
@WebMethod
public String sayMyName(@WebParam(name = "name") String name) {
return "Hello, ... " name;
}
}