JAXWS——如何更改终端地址

50

我该如何动态改变我的JAXWS客户端所使用的地址?此客户端是通过wsimport生成的。


请参考以下链接:https://dev59.com/LUbRa4cB1Zd3GeqP4uQX - Aleksi Yrttiaho
“动态”是否意味着“在运行时”? - Tomasz Nurkiewicz
1
请参考 https://dev59.com/1HA65IYBdhLWcg3w6DFO。 - McDowell
4个回答

109
你可以使用BindingProvider接口来实现这一点。 JAX-WS自定义端点
/**
 * The following snippets shows how to set a custom endpoint for a JAX-WS generated WebClient on runtime
 */

// Get the service and the port
SampleService service = new SampleService();
Sample port = service.getESamplePort();

// Use the BindingProvider's context to set the endpoint
BindingProvider bp = (BindingProvider)port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://www.aviramsegal.com/ws/sample");

/* Optional  credentials */
bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "user");
bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "password");
port.callSampleMethod();

1
是否可以为整个服务设置端点地址,而不是分别为每种方法设置? - T3rm1
3
对于该服务,缓存端口对象并随时重复使用。 - Aviram Segal
4
谢谢,它运作得很好!CXF非常容易使用……我的意思是,有谁不聪明到无法弄清楚我们需要使用BindingProvider接口来修改端口终点?此外,文档对此非常更新!但仍然存在本地配置XML文件覆盖所引用属性的情况。 - Alex
1
这对我没有起作用。它仍然默认使用WSDL中的地址。我使用了CXF进行Java转换。 - TastyWheat
2
关于此的重要说明:在设置这些值后,您需要使用相同的端口对象。如果您获取一个新的端口对象,它将具有默认的WSDL值,并且每次调用getPort时都会创建一个新的端口对象。 - Christopher Schneider
显示剩余3条评论

15

使用Apache CXF解决了这个问题。

只需要两行代码!以下是代码片段:

URL url_wsdl = new URL("http://myserver/myservice?wsdl");
Service service = Service.create(url_wsdl, new QName("http://myaddress...", "ServiceName"));
return service.getPort(MyJAXWSPortClass.class);

1
这个代码可以运行,但是像这样构建一个新的服务对象并不是一个好的解决方案。它会导致 WSDL 从新的端点重新解析,这样做非常昂贵。@McDowell 引用的帖子是实现所需功能的最佳方法:https://dev59.com/1HA65IYBdhLWcg3w6DFO - Helter Scelter
@HelterScelter:同意,但在某些情况下,这个价格是可以忽略的,例如当应用程序只需要在启动时映射一次该端口时。 - BxlSofty
1
只有当服务器“http://myserver/myservice?wsdl”在线时,它才能正常工作。 如果您有多个应用程序,则意味着必须按照明确定义的顺序部署它们,这可能会成为一个问题(在存在循环依赖的情况下甚至是不可能的)。 - Grigory Kislin
我转而使用BindingProvider解决方案,只是因为我们的代码会不时地被破坏,当客户发布新的WSDL时。我不想深入了解jaxws实现细节,但BindingProvider方式是首选解决方案。 - Junchen Liu
这对我来说不是一个选项。WSDL不能直接从服务端点获取。 - TastyWheat

3

我是PayPal集成的新手,不确定Adaptive Payment API。但我们可以通过GetVerifiedStatus方法检查特定电子邮件ID是否在PayPal中有帐户。

请使用以下沙盒WSDL URL验证电子邮件

URL: https://svcs.sandbox.paypal.com/AdaptiveAccounts?wsdl

响应将如下所示

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <ns2:GetVerifiedStatusResponse xmlns:ns2="http://svcs.paypal.com/types/aa">
         <responseEnvelope>
            <timestamp>2015-07-20T23:42:46.661-07:00</timestamp>
            <ack>Success</ack>
            <correlationId>5cea9a8575ab9</correlationId>
            <build>17345626</build>
         </responseEnvelope>
         <accountStatus>UNVERIFIED</accountStatus>
         <countryCode>IN</countryCode>
         <userInfo>
            <emailAddress>anandg.saga@gmail.com</emailAddress>
            <accountType>PERSONAL</accountType>
            <accountId>6KD7EVWM2E2AQW</accountId>
            <name>
               <salutation/>
               <firstName>anand</firstName>
               <middleName/>
               <lastName>anand</lastName>
               <suffix/>
            </name>
            <businessName/>
         </userInfo>
      </ns2:GetVerifiedStatusResponse>
   </soapenv:Body>
</soapenv:Envelope>

注意:在创建存根时,不要忘记将终点设置如下。 如果我们没有设置这个,就无法得到预期的输出。
String endpointURL = "https://svcs.sandbox.paypal.com/AdaptiveAccounts/GetVerifiedStatus";

请使用以下方法添加端点。
private static void addEndPoint(AdaptiveAccountsPortType port,
            String endpointURL) {
        BindingProvider bp = (BindingProvider)port;
        bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);

        /*List hchain = bp.getBinding().getHandlerChain();
        if (hchain == null) {
          hchain = new ArrayList();
        }
        hchain.add(new HTTPUserAgentHandler());
        bp.getBinding().setHandlerChain(hchain);*/
    }

0

如果您使用wsimport,我不确定如何做。我曾经遇到过同样的问题,所以我使用Intellij IDEA(版本9)为我创建客户端代码。它提供了一个服务端点构造函数,可以输入wsdl url。


1
我正在寻找使用wsimport的解决方案。不能使用Intellij IDEA。 - Kico Lobo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接