Клиент веб-служб Java не может получить доступ к погодным службам cdyne.com

Я изучаю, как реализовать веб-сервисы на Java. Следуя примеру из книги О'Рейли «Изучение Java», я скачал файл WSDL (см. http://bit.ly/13moiTh) для службы погоды на cdyne.com и создал набор классов с помощью инструмента wsimport.

Первая проблема заключалась в том, что когда я создал файл JAR и сослался на него в проекте Eclipse, классы не были распознаны. Мне пришлось использовать wsimport -keep и по отдельности скопировать все исходные файлы в проект, чтобы его собрать.

Затем, чтобы убедиться, что служба доступна, я создал простой HTTP POST-клиент на основе кода из книги. Я смог успешно получить доступ к службе getCityWeatherByZIP с помощью этого кода, поэтому проблем с подключением или аутентификацией не было.

Наконец, я попытался получить доступ к службам getCityWeatherByZIP и getCityForecastByZIP, используя автоматически сгенерированный код клиента веб-службы. Оба молча провалились, т. е. методы isSuccess() вернули false, а все поля ответа были нулевыми:

Weather service = new Weather();
WeatherSoap weatherSoap = service.getWeatherSoap();
WeatherReturn weather = weatherSoap.getCityWeatherByZIP(ZIP);
if (weather.isSuccess()) {      
    System.out.format("%s, %s : %s : Temperature: %s, Wind: %s\n",
            weather.getCity(), weather.getState(), weather.getDescription(),
            weather.getTemperature(), weather.getWind());
}
else {
    System.out.println("Failed to obtain weather");
}

При выполнении кода в getCityWeatherByZIP() я обнаружил следующее исключение NoSuchMethodException: "

Это исключение возникает в строке, которая говорит (в перспективе отладки Eclipse): «Строка SEIStub.invoke(Object, Method, Object[]): недоступна»

Очевидно, что метод Packet.setHeaderList(HeaderList) не существует, что также подтверждается документацией невнутреннего класса: https://jax-ws.java.net/nonav/jax-ws-20-fcs/arch/com/sun/xml/ws/api/message/Packet.html

Я использую последнюю версию JDK 1.7 и Eclipse: Kepler Service Release 1, идентификатор сборки: 20130919-0819.

Я не знаю, как решить эту проблему. Любая помощь будет оценена по достоинству.


person user1408140    schedule 24.02.2014    source источник
comment
Я исправил проблему: в проекте Eclipse отсутствовал файл package-info.java. Как только я добавил его в пакет, следуя этим инструкциям, все начало работать: stackoverflow.com/questions/8405336/   -  person user1408140    schedule 27.02.2014


Ответы (1)


В дополнение к исходному коду из книги вам также потребуется копия кода веб-службы JAX-WS для компиляции и запуска. Вы обновляете путь сборки внутри Eclipse, чтобы ссылаться на любые jar-файлы для веб-службы JAX-WS, и похоже, что у Eclipse нет копии в пути к классам.

JAX-WS - это спецификация, но вам понадобится фактическая реализация JAX-WS для запуска, возможно, эталонная реализация?

person mikemil    schedule 24.02.2014
comment
Ну, у меня также есть очень простая реализация веб-службы с использованием аннотаций WebService и WebMethod из другого примера в книге, и, похоже, она работает нормально. Не делая ничего особенного, я могу просто запустить программу в Eclipse, а затем использовать браузер для доступа к работающему серверу, например. для получения автоматически сгенерированного файла WSDL. Клиентский код, который я описал выше, компилируется и запускается без каких-либо видимых исключений (исключения видны только при пошаговом выполнении кода); однако экземпляры WeatherReturn и ForecastReturn просто пусты. Итак, я не знаю, что делать. - person user1408140; 25.02.2014
comment
Вы видели эту страницу - wiki.cdyne.com/index.php/CDYNE_Weather#Example_Source_Code из их вики - похоже, внизу страницы есть несколько ссылок на некоторые образцы на разных языках. - person mikemil; 25.02.2014
comment
Спасибо, но это не решает проблему. Код из книги очень прост и использует API, предоставляемый классами, автоматически генерируемыми wsimport из WSDL cdyne. Кстати, это говорит о том, что JDK 1.7 включает JAX-WS 2.2: docs.oracle.com/javase/7/docs/technotes/guides/xml/jax-ws, что объясняет, почему я могу скомпилировать и запустить как клиент, так и сервер без каких-либо специальных действий в Eclipse или из командной строки. . - person user1408140; 25.02.2014