Проблема, мне нужно создать клиент web-сервиса из файла я'м была предоставлена. Я'вэ хранить этот файл в локальной файловой системе и, в то время как я продолжаю WSDL-файл в нужную папку файловой системы, все нормально. Когда я развернуть его на сервер или удалить WSDL-файл из файловой системы в папку прокси может'т найти WSDL и увеличивает ошибку. Я'вэ искал в интернете и я'вэ нашел следующие посты пока я'м не смог заставить его работать: https://stackoverflow.com/questions/764772/jax-ws-loading-wsdl-from-jar http://www.java.net/forum/topic/glassfish/metro-and-jaxb/client-jar-cant-find-local-wsdl-0 http://blog.vinodsingh.com/2008/12/locally-packaged-wsdl.html
Я'м с помощью NetBeans 6.1 (это устаревшее приложение, Я'вэ для обновления с помощью этого нового веб-сервиса клиента). Ниже в JAX-WS в прокси-классе :
@WebServiceClient(name = "SOAService", targetNamespace = "http://soaservice.eci.ibm.com/", wsdlLocation = "file:/C:/local/path/to/wsdl/SOAService.wsdl")
public class SOAService
extends Service
{
private final static URL SOASERVICE_WSDL_LOCATION;
private final static Logger logger = Logger.getLogger(com.ibm.eci.soaservice.SOAService.class.getName());
static {
URL url = null;
try {
URL baseUrl;
baseUrl = com.ibm.eci.soaservice.SOAService.class.getResource(".");
url = new URL(baseUrl, "file:/C:/local/path/to/wsdl/SOAService.wsdl");
} catch (MalformedURLException e) {
logger.warning("Failed to create URL for the wsdl Location: 'file:/C:/local/path/to/wsdl/SOAService.wsdl', retrying as a local file");
logger.warning(e.getMessage());
}
SOASERVICE_WSDL_LOCATION = url;
}
public SOAService(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
public SOAService() {
super(SOASERVICE_WSDL_LOCATION, new QName("http://soaservice.eci.ibm.com/", "SOAService"));
}
/**
* @return
* returns SOAServiceSoap
*/
@WebEndpoint(name = "SOAServiceSOAP")
public SOAServiceSoap getSOAServiceSOAP() {
return super.getPort(new QName("http://soaservice.eci.ibm.com/", "SOAServiceSOAP"), SOAServiceSoap.class);
}
/**
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns SOAServiceSoap
*/
@WebEndpoint(name = "SOAServiceSOAP")
public SOAServiceSoap getSOAServiceSOAP(WebServiceFeature... features) {
return super.getPort(new QName("http://soaservice.eci.ibm.com/", "SOAServiceSOAP"), SOAServiceSoap.class, features);
}
}
<БР> Это мой код, чтобы использовать прокси-сервер :
WebServiceClient annotation = SOAService.class.getAnnotation(WebServiceClient.class);
// trying to replicate proxy settings
URL baseUrl = com.ibm.eci.soaservice.SOAService.class.getResource("");//note : proxy uses "."
URL url = new URL(baseUrl, "/WEB-INF/wsdl/client/SOAService.wsdl");
//URL wsdlUrl = this.getClass().getResource("/META-INF/wsdl/SOAService.wsdl");
SOAService serviceObj = new SOAService(url, new QName(annotation.targetNamespace(), annotation.name()));
proxy = serviceObj.getSOAServiceSOAP();
/* baseUrl;
//classes\com\ibm\eci\soaservice
//URL url = new URL(baseUrl, "../../../../wsdl/SOAService.wsdl");
proxy = new SOAService().getSOAServiceSOAP();*/
//updating service endpoint
Map<String, Object> ctxt = ((BindingProvider)proxy ).getRequestContext();
ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192);
ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WebServiceUrl);
В NetBeans поместить копию WSDL в веб-инф/WSDL-файл/клиент/SOAService, так что я Дон'т хотите, чтобы добавить его в мета-инф тоже. Классы обслуживания веб-инф/классов/ком/ИБМ/РВ/soaservice/ и автоопределения переменная содержит файловой системы, полный путь к нему (c:\path\to\the\project...\soaservice ). Приведенный выше код вызывает ошибку:
класс javax.в формате XML.с WS.WebServiceException: не удалось получить доступ к WSDL по: файл:/веб-инф/WSDL-файл/клиент/SOAService.язык WSDL. Не получилось с: Веб-инф \WSDL-файл\клиент\SOAService.язык WSDL (не может найти путь)
Итак, в первую очередь, должен ли я обновить wsdllocation прокси-класс? Тогда как я скажу класс SOAService в веб-инф/классов/ком/ИБМ/РВ/soaservice для поиска WSDL-файл в WEB-INF-файл \WSDL-файл\клиент\SOAService.язык WSDL?
Редактировать: я'вэ нашел другой ссылке - http://jianmingli.com/wp/?cat=41, что сказать, чтобы поставить WSDL-файл в classpath. Я'м стыдно спрашивать: как я могу положить его в classpath веб-приложения?
Самый лучший вариант это использовать jax-ws-catalog.xml
При компиляции местных WSDL-файл , изменить расположение WSDL и установить его на что-то вроде
в <предварительно> http://localhost/wsdl/SOAService.wsdl </пред>
Дон'т беспокойтесь, это только URI, а не URL-адрес , означает, что вы Дон'т должны иметь WSDL-файл доступен по этому адресу. Вы можете сделать это, передав параметр wsdllocation к WSDL к Java-компилятор.
Это позволит менять свой прокси-код
static {
URL url = null;
try {
URL baseUrl;
baseUrl = com.ibm.eci.soaservice.SOAService.class.getResource(".");
url = new URL(baseUrl, "file:/C:/local/path/to/wsdl/SOAService.wsdl");
} catch (MalformedURLException e) {
logger.warning("Failed to create URL for the wsdl Location: 'file:/C:/local/path/to/wsdl/SOAService.wsdl', retrying as a local file");
logger.warning(e.getMessage());
}
SOASERVICE_WSDL_LOCATION = url;
}
для
static {
URL url = null;
try {
URL baseUrl;
baseUrl = com.ibm.eci.soaservice.SOAService.class.getResource(".");
url = new URL(baseUrl, "http://localhost/wsdl/SOAService.wsdl");
} catch (MalformedURLException e) {
logger.warning("Failed to create URL for the wsdl Location: 'http://localhost/wsdl/SOAService.wsdl', retrying as a local file");
logger.warning(e.getMessage());
}
SOASERVICE_WSDL_LOCATION = url;
}
Файл Примечание:// изменен на HTTP:// в конструкторе URL-адрес.
Сейчас приходит в jax-ws-catalog.xml. Без jax-ws-catalog.xml в JAX-WS можно действительно попробовать загрузить WSDL-файл из папки в <предварительно>http://localhost/wsdl/SOAService.wsdl </пред> и не получится, поскольку такой WSDL-файл будет доступен.
Но с jax-ws-catalog.xml вы можете перенаправить в JAX-WS в местах заготовок WSDL-файл всякий раз, когда он пытается получить доступ к WSDL @ в <предварительно>http://localhost/wsdl/SOAService.wsdl </подготовка и GT;.
Здесь'ы jax-ws-catalog.xml
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="system">
<system systemId="http://localhost/wsdl/SOAService.wsdl"
uri="wsdl/SOAService.wsdl"/>
</catalog>
Что вы делаете, говорит в JAX-WS в том, что когда-нибудь он должен загрузить WSDL от в <предварительно>http://localhost/wsdl/SOAService.wsdl </пред>, он должен загрузить его из локального пути в WSDL/SOAService.язык WSDL.
Теперь, где вы должны положить в WSDL/SOAService.WSDL и jax-ws-catalog.xml ? Что'ы вопрос на миллион долларов-это'т его ? Она должна быть в META-INF каталог вашего jar приложения.
что-то вроде этого
в <предварительно> ABCD.jar | МЕТА-ИНФ | jax-ws-catalog.xml | WSDL-файл | SOAService.язык WSDL </пред>
Таким образом, вы Дон't даже должны переопределить URL-адрес в ваш клиент, что доступ к прокси. WSDL-файл взял из фляги, и вам не придется иметь жесткие ссылки файловой системы в коде.
Подробнее о jax-ws-catalog.xml http://jax-ws.java.net/nonav/2.1.2m1/docs/catalog-support.html
Надеюсь, что помогает
Один подход, который мы взяли успешно генерировать спецификации WS клиентский прокси-код с помощью wsimport (от муравья, а задача Муравья) и указать атрибут wsdlLocation.
<wsimport debug="true" keep="true" verbose="false" target="2.1" sourcedestdir="${generated.client}" wsdl="${src}${wsdl.file}" wsdlLocation="${wsdl.file}">
</wsimport>
Так как мы запускаем этот проект с нескольких файлов WSDL, сценарий разыгрывает $(на языке WSDL.файл} значение динамически устанавливается для /мета-инф/язык WSDL/YourWebServiceName.язык WSDL относительно местоположения JavaSource (или /src, и в зависимости от вашего проекта). В проесс строить, WSDL и файлов файлы xsd копируются в эту папку и упакованы в jar-файл. (аналогичное решение описано Bhasakar выше)
MyApp.jar
|__META-INF
|__wsdl
|__YourWebServiceName.wsdl
|__YourWebServiceName_schema1.xsd
|__YourWebServiceName_schmea2.xsd
Примечание: убедитесь, что файлы WSDL используется относительный refrerences на любой импортированные файлы xsd, а не URL-адреса http:
<types>
<xsd:schema>
<xsd:import namespace="http://valueobject.common.services.xyz.com/" schemaLocation="YourWebService_schema1.xsd"/>
</xsd:schema>
<xsd:schema>
<xsd:import namespace="http://exceptions.util.xyz.com/" schemaLocation="YourWebService_schema2.xsd"/>
</xsd:schema>
</types>
В автоматически код, мы находим это:
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.2-b05-
* Generated source version: 2.1
*
*/
@WebServiceClient(name = "YourService", targetNamespace = "http://test.webservice.services.xyz.com/", wsdlLocation = "/META-INF/wsdl/YourService.wsdl")
public class YourService_Service
extends Service
{
private final static URL YOURWEBSERVICE_WSDL_LOCATION;
private final static WebServiceException YOURWEBSERVICE_EXCEPTION;
private final static QName YOURWEBSERVICE_QNAME = new QName("http://test.webservice.services.xyz.com/", "YourService");
static {
YOURWEBSERVICE_WSDL_LOCATION = com.xyz.services.webservice.test.YourService_Service.class.getResource("/META-INF/wsdl/YourService.wsdl");
WebServiceException e = null;
if (YOURWEBSERVICE_WSDL_LOCATION == null) {
e = new WebServiceException("Cannot find '/META-INF/wsdl/YourService.wsdl' wsdl. Place the resource correctly in the classpath.");
}
YOURWEBSERVICE_EXCEPTION = e;
}
public YourService_Service() {
super(__getWsdlLocation(), YOURWEBSERVICE_QNAME);
}
public YourService_Service(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
/**
*
* @return
* returns YourService
*/
@WebEndpoint(name = "YourServicePort")
public YourService getYourServicePort() {
return super.getPort(new QName("http://test.webservice.services.xyz.com/", "YourServicePort"), YourService.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns YourService
*/
@WebEndpoint(name = "YourServicePort")
public YourService getYourServicePort(WebServiceFeature... features) {
return super.getPort(new QName("http://test.webservice.services.xyz.com/", "YourServicePort"), YourService.class, features);
}
private static URL __getWsdlLocation() {
if (YOURWEBSERVICE_EXCEPTION!= null) {
throw YOURWEBSERVICE_EXCEPTION;
}
return YOURWEBSERVICE_WSDL_LOCATION;
}
}
Возможно, это тоже может помочь. Это's просто другой подход, который не использует в "Каталог" и подход.
Благодаря тонну для Бхаскар Karambelkar'ы ответ, который подробно объясняет и фиксированная моя проблема. Но также я хотел бы еще раз сформулировать ответ в три простых шагов для кого-то, кто торопится исправить
wsdlLocation= "и http://localhost/wsdl/yourwsdlname.wsdl"
в <каталог префиксом xmlns=на"урна:оазис:названия:ТС:объект:описание:XML-файле:каталог"и предпочитаю=на"Системы"> <systemId система="и http://localhost/wsdl/yourwsdlname.wsdl" Ури="на языке WSDL/yourwsdlname.язык WSDL-то" /> </каталог>
Теперь пакет банку. Нет больше привязки к локальному каталогу, она's Все упаковано и ссылки в
Если вы используете Весна, вы можете просто ссылаться на какие-либо пути к классу-ресурса с помощью классов-протокол. Так что в случае wsdlLocation, это становится:
<wsdlLocation>classpath:META-INF/webservice.wsdl</wsdlLocation>
Обратите внимание, что это не стандартное поведение для Java. См. также: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/resources.html
Имел точно те же проблемы, описанной в настоящем документе. Что бы я ни делала, после приведенных выше примеров, чтобы изменить местоположение моего WSDL-файл (в нашем случае с веб-сервера), он был все еще ссылаться на исходное место, встроенные в источник дерево процесса сервера.
После много часов, пытаясь отладить это, я заметил, что за исключением всегда были брошены из одной и той же линии (в моем случае 41). Наконец этим утром я решила просто отправить моего клиента исходный код наших торговых партнеров, чтобы они могли, по крайней мере, понять, как код выглядит, но и возможно строить свои собственные. На мой шок и ужасы я нашла кучу файлов класса смешивается с моим .Java-файлы внутри моего клиента-источника дерева. Как странно!! Я подозреваю, что это были побочным продуктом в JAX-WS инструмент строителя клиента.
После того как я zapped эти глупые .файлы классов и полной очистке и восстановлению клиентского кода, все работает отлично!! Redonculous!!
YMMV, Андрей