Создание службы JAX-WS без загрузки WSDL? - PullRequest
16 голосов
/ 11 ноября 2011

У меня есть веб-сервис, для которого у меня сгенерированы клиентские привязки JAX-WS, как показано ниже:

// web service client generated by JAX-WS
@WebServiceClient( ... )
public class WebService_Service extends Service {

    public WebService_Service(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    WebService getWebServiceSOAP() {
        // ...
    }
}

Я хочу иметь возможность создать экземпляр этого объекта, который указывает на удаленный сервис, такой как:

WebService_Service svc = new WebService_Service(
    new URL("http://www.example.com/ws?wsdl"),
    new QName("http://www.example.com/ws", "WebService"));

Но это загружает WSDL из http://www.example.com/ws?wsdl, что я не хочу делать.

Есть ли способ остановить загрузку этого WSDL, но все же указать на ту же самую конечную точку

Ответы [ 3 ]

19 голосов
/ 04 февраля 2013

Я решил эту проблему, указав значение NULL для URL-адреса WSDL в клиенте, а также явно указав адрес конечной точки:

WebService_Service svc = new WebService_Service(
  null,
  new QName("http://www.example.com/ws", "WebService"));
WebService port = svc.getPort(WebService.class);
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext()
  .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
    "http://www.example.com/real_endpoint_url_goes_here");

См .: http://shrubbery.homeip.net/c/display/W/Consuming+a+Web+Service+with+Java+6+and+JAX-WS#ConsumingaWebServicewithJava6andJAX-WS-IgnoringtheWSDLCompletely

2 голосов
/ 12 мая 2014

Файлы WSDL могут содержать параметры конфигурации, которые не содержат сгенерированные заглушки, поэтому они необходимы во время выполнения.Вы можете предоставить их локально в вашем пути к классам.

Следующий файл maven pom.xml работал для меня после помещения файлов WSDL службы, которую я использую, в мою папку ${basedir}\src\main\resources\META-INF\wsdl:

<plugin>
  <groupId>org.jvnet.jax-ws-commons</groupId>
  <artifactId>jaxws-maven-plugin</artifactId>
  <version>2.3</version>
  <executions>
    <execution>
      <id>MyService</id>
      <goals>
        <goal>wsimport</goal>
      </goals>
      <configuration>
        <!-- this resolves naming conflicts within the wsdl - there are several copies of fault report objects which clash otherwise. -->
        <args>
          <arg>-B-XautoNameResolution</arg>
        </args>

        <packageName>de.xyz</packageName>
        <wsdlDirectory>${basedir}\src\main\resources\META-INF\wsdl</wsdlDirectory>
        <wsdlFiles>
          <wsdlFile>MyService.wsdl</wsdlFile>
        </wsdlFiles>
        <wsdlLocation>META-INF/wsdl/MyService.wsdl</wsdlLocation>                           
      </configuration>
    </execution>
  [...]

Во время выполнения файлы wsdl будут загружены из пути к классам.

1 голос
/ 11 ноября 2011

У меня была та же проблема, и я решил ее, но я не могу раскрыть ее с вашим примером, потому что это зависит от wsdl.

Вот мой код, отследите решение:

    //This is the input object for the webservice
    GetDocumentInfoInput input = new GetDocumentInfoInput();
    input.setBarcode(barcode);
    //I instantiate the WS
    MAKSpcIntSpcWFSpcScannerInfo_Service service  = new MAKSpcIntSpcWFSpcScannerInfo_Service();
    //I get the WS port
    MAKSpcIntSpcWFSpcScannerInfo         port     = service.getMAKSpcIntSpcWFSpcScannerInfo();
    WSBindingProvider                    provider = (WSBindingProvider)port;
    //This is the row what set the URL for the WS
    provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
    //This is the WS calling
    GetDocumentInfoOutput                output   = port.getDocumentInfo(input);
...