Простой клиентский код Java для веб-службы - что делать с QName?

Когда я дохожу до строки, вызывающей ДЕЙСТВИТЕЛЬНО БАЗОВЫЙ веб-сервис, запущенный на Tomcat / Axis, я получаю следующую ошибку.

Element or attribute do not match QName production: QName::=(NCName':')?NCName

У меня что-то не так с QName? - Я даже не могу найти никакой полезной информации о нем.

Мой клиентский код ниже:

import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

    public class TestClient {

    public static void main(String [] args)
    {
        try{
            String endpoint = "http://localhost:8080/TestWebService/services/DoesMagic";  

            Service service = new Service();
            Call call = (Call) service.createCall();

            call.setTargetEndpointAddress( new java.net.URL(endpoint) );
            call.setOperationName( new QName("http://testPackage.fc.com/, doBasicStuff") );

            String ret = (String) call.invoke( new Object[] {"some kind of message"} );

            System.out.println(ret);

        }catch(Exception e){
            System.err.println(e.toString());
        }
    }
}

Мой код веб-службы действительно базовый - просто простой класс, который возвращает вашу строку ввода с небольшим количеством текста concat:

public String doBasicStuff(String message)
    {
        return "This is your message: " + message;

    }

Есть ли причина, по которой вы не используете wsdl2java с Axis для создания прокси-классов для веб-службы и ее методов? Я не могу сказать, пишете ли вы просто образец / тестовый код, но обычно вам не нужно использовать объект Call или методы invoke () самостоятельно. wsd2ljava может сэкономить вам много времени.

matt b 14.10.2008 21:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
56 144
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Может быть, это опечатка в вашем QName ?:

new QName("http://testPackage.fc.com/", "doBasicStuff")

вместо:

new QName("http://testPackage.fc.com/, doBasicStuff")
Ответ принят как подходящий

Как говорится в исключении, вы неправильно вызываете конструктор QName:

new QName("http://testPackage.fc.com/, doBasicStuff")

это неверно. Я думаю, вам нужно передать две строки, одна из которых содержит пространство имен, а другая - локальное имя. Документация обычно содержит описание того, как использовать этот класс.

Вам следует использовать один из них:

public QName(String localPart)     or
public QName(final String namespaceURI, final String localPart)

но новый QName ("http://testPackage.fc.com/, doBasicStuff") неверно, поскольку оба значения находятся в одной строке ".., .."

С уважением

новый QName ("soapenc: string", "doBasicStuff")

Просто введите имя метода, который должен быть в вашем случае call.setOperationName("doBasicStuff");

Другие вопросы по теме