Вызов веб-службы. Нужна недостающая ссылка

#java #web-services #hyperlink

#java #веб-службы #гиперссылка

Вопрос:

Может ли кто-нибудь заполнить недостающую ссылку в приведенном ниже коде?

Первый способ:

Файл интерфейса веб-службы — HappyService.

 JaxWSProxyFactoryBean factory = new JaxWsProxyFactoryBean();

factory.getInterceptors().add(new LoggingInInterceptor());
factory.getInterceptors().add(new LoggingOutInterceptor());

//MISSING LINK. Where does HappyService.class come from? I don't have it
factory.setServiceClass(HappyService.class);

factory.setAddress("http://......../happyService");

//Again how do I get HappyService?
HappyService client = (HappyService) factory.create();
  

Второй способ:

 String UrlString = "Your WSDL URL";   
   String nameSpaceUri = "urn:Foo";
   String serviceName = "MyHelloService";
   String portName = "HelloIFPort";

   URL helloWsdlUrl = new URL(UrlString);

   ServiceFactory serviceFactory = ServiceFactory.newInstance();

   Service helloService =
            serviceFactory.createService(helloWsdlUrl, 
            new QName(nameSpaceUri, serviceName));

   //Where did dynamicproxy.HelloIF come from? This code won't compile as that file does not exist anywhere
   dynamicproxy.HelloIF myProxy = 
            (dynamicproxy.HelloIF) 
            helloService.getPort(
            new QName(nameSpaceUri, portName), 
            dynamicproxy.HelloIF.class); 

        System.out.println(myProxy.sayHello("Buzz"));
  

Любой, кто имеет представление о том, откуда берутся эти интерфейсные классы и как они генерируются, пожалуйста, дайте мне знать. Похоже, что единственный способ, которым я могу выполнить вызов веб-службы, — это написать SOAP-запрос вручную, и я действительно не хочу этого делать, поскольку он может стать очень большим и подверженным ошибкам.

Комментарии:

1. Используете ли вы фреймворк веб-службы? Основываясь на первом примере, я думаю, что вы используете CXF. Класс HappyService должен быть классом, сгенерированным задачей wsdl2java, предоставляемой CXF. У вас нет сгенерированного пакета classes?

2. Я заметил, что ваш другой вопрос выглядит как более ранняя версия этого. Я бы посоветовал вам отредактировать существующий вопрос, чтобы добавить больше деталей, вместо того чтобы открывать новый в будущем. Добро пожаловать в StackOverflow!

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

4. Есть ли у вас доступ к WSDL целевого веб-сервиса? Смотрите мой ответ ниже, это может вам помочь.

Ответ №1:

Существует множество инструментов, которые генерируют классы Java веб-служб из файлов определения WSDL.

Вы могли бы попробовать JAXB, который является стандартным инструментом Java для этой задачи. Другой возможностью является Axis, которая на уровень выше.

Ответ №2:

Вам нужна библиотека SOAP, такая как Apache Axis2. Библиотека будет включать инструменты для генерации классов Java из WSDLS. Вы бы использовали этот сгенерированный код для выполнения вызовов веб-службы.

Комментарии:

1. То есть в принципе нет способа генерировать эти классы «на лету»? Я имею в виду, что я хочу развернуть приложение, которое может запускать веб-службы, зная немного больше, чем URL-адрес WSDL. Похоже, что это было бы очень распространенным делом.

2. Предположительно, вы могли бы сгенерировать новый клиент во время выполнения с помощью Axis2 и загрузить эти новые классы в текущую JVM для вызова веб-службы. Я никогда раньше не пытался это сделать и даже не видел необходимости в этом. Вы также могли бы попытаться написать «универсальный» клиент, который проверяет WSDL и создает одноразовый вызов этой службы. По сути, вы бы делали то, что делает генератор библиотеки SOAP, без записи какого-либо клиентского кода на диск.

Ответ №3:

Основываясь на вашем первом примере, я думаю, что вы используете фреймворк CXF.

Эта платформа предоставляет задачу с именем wsdl2java, которая позволяет генерировать классы из файла WSDL.

Как только ваши классы будут сгенерированы, вы сможете использовать их в своем коде для простого вызова веб-службы без необходимости создавать SOAP-сообщение вручную. Это задача CXF — сделать это.

Ответ №4:

Я думаю, это поможет, если вы обратитесь к нескольким основам веб-служб на Java

http://www.oracle.com/technetwork/java/index-jsp-137004.html

http://metro.java.net/