Отсутствуют параметры метода SOAP в сгенерированном WSDL с использованием Java 1.6 по умолчанию java.xml.ws API

#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;
    }

}