Как получить HashMap как @WebParam с JBossWS 3.1.2 - PullRequest
2 голосов
/ 11 января 2011

Я пытаюсь разработать веб-сервис с JBossWS 3.1.2, в качестве аргумента которого используется HashMap. Я использую эту версию JBossWS, потому что это то, что распространяется с версией JBoss, которую я использую. Я использую wsprovide для генерации WSDL и wsconsume для создания заглушек клиента WS.

Упрощенная версия моего WebService:

@WebService(targetNamespace = "http://localhost/ping", serviceName = "Ping")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class Ping {
    @WebMethod
    @WebResult(name="result")
    public String ping(@WebParam(name="arguments") HashMap arguments) {
        return "pong";
    }
}

WSDL, созданный wsprovide, содержит:

<types>
    <xs:schema targetNamespace='http://localhost/ping' version='1.0' xmlns:tns='http://localhost/ping' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
        <xs:complexType name='hashMap'>
            <xs:complexContent>
                <xs:extension base='tns:abstractMap'>
                    <xs:sequence/>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
        <xs:complexType abstract='true' name='abstractMap'>
            <xs:sequence/>
        </xs:complexType>
    </xs:schema>
</types>

Сгенерированный код клиента содержит пустой абстрактный класс AbstractMap.java и пустой класс HashMap.

Я бы ожидал, что будет сгенерирован WSDL, подобный следующему:

<complexType>
    <sequence>
        <element name="key" type="anyType" />
        <element name="value" type="anyType" />
    </sequence>
</complexType>

Я также попытался обернуть HashMap пользовательским классом (ParameterMap), но получил больше того же самого.

Есть ли следующий шаг, которого я не вижу? Я что-то упустил или это ограничение восходящего подхода к разработке веб-сервисов с JBossWS?

1 Ответ

5 голосов
/ 11 января 2011

Ответ был в другом посте Как я могу передать массив как значение в запрос PHP-мыла?

Я бы никогда не подумал заглянуть в вопрос PHP дляРешение JAX-WS ...

HashMap должен быть заключен в другой класс Java с именем HashMapWrapper.java (или любой другой).

public class HashMapWrapper {
    public HashMap<String, Object> parameters;
}

Необходимо изменить вызов метода ping, чтобыиспользуйте класс-оболочку вместо HashMap:

public String ping(@WebParam(name="arguments") HashMapWrapper arguments) {

Это генерирует соответствующий WSDL, который, в свою очередь, генерирует полезные заглушки Java.

...