Если вы хотите сделать это в оболочке:
#!/bin/bash
file=$1
designation=$2
# code to validate user input here ...
sum=0
count=0
while IFS=, read -r n d s; do
if [[ ${designation,,} == "${d,,}" ]]; then
(( sum += s ))
(( count++ ))
fi
done < "$file"
if (( count == 0 )); then
echo "No $designation found in $file"
else
echo $((sum / count))
fi
Вот мой хакерский обходной путь.
Я распаковываю WSDL из банки и записываю его в файл рядом с jar:
File wsdl = new File("../lib/service.wsdl");
InputStream source = getClass().getResource("resources/service.wsdl").openStream();
FileOutputStream out = new FileOutputStream(wsdl);
byte[] buffer = new byte[512];
int read;
while((read = source.read(buffer)) >= 0) {
out.write(buffer, 0, read);
}
Затем укажите классы обслуживания на файл : ../ lib / service.wsdl
.
Это работает, но я буду признателен, если кто-нибудь сможет показать мне более элегантное решение.
Если у вашего пути к классам есть "." в нем Class.getResource (".") вернет URL-адрес каталога, из которого вы выполнили команду java. Иначе, он вернет ноль. Отрегулируйте wsdllocation соответственно.
Да, это вполне возможно, поскольку я сделал это при создании клиентов через javax.xml.ws.EndpointReference, класс, связанный с WS-A. Я добавил ссылку на путь к классам WSDL в WS-A EndPointReference, и реализация JAX-WS в Metro загрузила его очень хорошо. Независимо от того, загружается ли WSDL из WS-A EndPointReference или из файла или URL-адреса http, ваша реализация JAX-WS должна использовать тот же код синтаксического анализа WSDL, что и все, что вы делаете, - это разрешение URL.
Лучшим подходом для вас, вероятно, будет сделать что-то вроде следующего:
URL wsdlUrl = MyClass.class.getResource(
"/class/path/to/wsdl/yourWSDL.wsdl");
Service yourService= Service.create(
wsdlUrl,
...);
Где ... представляет QName Сервис WSDL внутри вашего WSDL. Теперь важно помнить, что ваш WSDL должен быть полным и действительным. Это означает, что если ваш WSDL импортирует файлы XSD или другие WSDL, URL-адреса должны быть правильными. Если вы включили импортированные WSDL и XSD в тот же JAR, что и файл WSDL, вы должны использовать относительные URL-адреса для импорта и сохранить все импортированные файлы в том же файле JAR. Обработчик URL-адресов JAR не обрабатывает относительные URL-адреса как относительные по отношению к пути к классам, а скорее как относительные в файле JAR, поэтому вы не можете иметь импорт в своем WSDL, который выполняется через JAR, если вы не реализуете пользовательский обработчик URL-адресов и свой собственный префикс для выполнения разрешение импорта на основе пути к классам. Если ваш WSDL импортирует внешние ресурсы, это нормально, но вы подписываетесь на проблемы с обслуживанием, если эти ресурсы когда-либо перемещаются. Даже использование статической копии WSDL из пути к классам противоречит духу WSDL, веб-служб и JAX-WS, но бывают случаи, когда это необходимо.
Наконец, если вы встраиваете статический WSDL, я предлагаю чтобы вы, по крайней мере, сделали конечную точку службы настраиваемой для целей тестирования и развертывания. Код для перенастройки конечной точки вашего клиента веб-службы выглядит следующим образом:
YourClientInterface client = yourService.getPort(
new QName("...", "..."),
YourClientInterface.class);
BindingProvider bp = (BindingProvider) client;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://localhost:8080/yourServiceEndpoint");
Я наткнулся на ту же проблему. Код клиента генерации JAXWS использует трюк MyService.class.getResource (".")
для загрузки файла wsdl ... но после тестирования кажется, что это работает, только если файл класса находится в каталоге на файловая система. Если файл класса находится в JAR, этот вызов возвращает ноль для URL.
Это звучит как ошибка в JDK, поскольку если вы создадите свой URL-адрес следующим образом:
final URL url = new URL( MyService.class.getResource( MyService.class.getSimpleName() + ".class"), "myservice.wsdl");
, тогда он также будет работать, если класс и wsdl объединены в jar.
Я думаю, что большинство людей действительно объединят в пакет банка!
Если файл класса находится в JAR, этот вызов возвращает ноль для URL.Это звучит как ошибка в JDK, поскольку если вы создадите свой URL-адрес следующим образом:
final URL url = new URL( MyService.class.getResource( MyService.class.getSimpleName() + ".class"), "myservice.wsdl");
, тогда он также будет работать, если класс и wsdl объединены в jar.
Я думаю, что большинство людей действительно объединят в пакет банка!
Если файл класса находится в JAR, этот вызов возвращает ноль для URL.Это звучит как ошибка в JDK, поскольку если вы создадите свой URL-адрес следующим образом:
final URL url = new URL( MyService.class.getResource( MyService.class.getSimpleName() + ".class"), "myservice.wsdl");
, тогда он также будет работать, если класс и wsdl объединены в jar.
Я думаю, что большинство людей действительно объединят в пакет банка!
Может быть, немного поздно, но я нашел довольно простое решение, которое помогло решить эту проблему, но оно включало изменение сгенерированного кода класса обслуживания:
Если следующая строка в классе обслуживания
baseUrl = net.example.ApplicationService.class.getResource(".");
будет изменена на
baseUrl = net.example.ApplicationService.class.getResource("");
он отлично работает даже с WSDL, упакованным в JAR. Не уверен в точном предполагаемом поведении getResource () в любом из этих случаев, но пока у меня не было никаких проблем с этим подходом,
Другой ответ - использовать
new Service(wsdllocation, servicename );
для получения объекта службы.
Вот как я решил проблему.