JAXWS — 如何更改端点地址 [重复]

Posted

技术标签:

【中文标题】JAXWS — 如何更改端点地址 [重复]【英文标题】:JAXWS — how to change the endpoint address [duplicate] 【发布时间】:2011-07-06 17:22:27 【问题描述】:

如何动态更改我的 JAXWS 客户端正在使用的地址? 此客户端由 wsimport 生成。

【问题讨论】:

见***.com/questions/649019/… 动态是指在运行时吗? 见***.com/questions/3569075/jaxws-service-client 【参考方案1】:

您可以使用 BindingProvider 接口来实现。

JAX-WS custom endpoint

/**
 * 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();

【讨论】:

是否可以为整个服务设置端点地址,而不是为每个方法单独设置? 这会改变服务,缓存端口对象,并根据需要多次使用 谢谢,效果很好! CXF 太容易使用了……我的意思是,谁不聪明到发现我们需要使用 BindingProvider 接口来修改端口端点?此外,有关此的文档是如此最新!仍然得到覆盖所引用属性的本地 conf XML 文件。 这对我不起作用。它仍然默认为 WSDL 中的地址。我使用 CXF 转换为 Java。 关于此的重要说明:设置这些值后,您需要使用相同的端口对象。如果你得到一个新的,它将具有默认的 WSDL 值,并且每次调用 getPort 时都会创建一个新值。【参考方案2】:

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

只需两行代码!这是sn-p:

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);

【讨论】:

这确实/应该工作,但是像这样构造一个新的服务对象并不是一个好的解决方案。它会导致从新端点重新解析 WSDL,而且执行起来非常昂贵。 @McDowell 引用的帖子是完成所要求的事情的最佳方式:***.com/questions/3569075/jaxws-service-client @HelterScelter :同意,但在某些情况下这个价格可以忽略不计,例如当应用程序只需要在启动时映射此端口一次。 只有在服务器“myserver/myservice?wsdl”在线时才有效。如果您有多个应用程序,这意味着以直接定义的顺序部署它们,这可能是一个问题(在循环依赖的情况下甚至是不可能的) 我从这个切换到 BindingProvider 解决方案,只是因为当客户发布新的 WSDL 时,我们的代码会不时被破坏。我不想深入研究 jaxws 的实现细节,但 BindingProvider 方式是首选解决方案。 这不是我的选择。 WSDL 不能直接从服务端点获得。【参考方案3】:

我是 PayPal 集成的新手,我不确定 Adaptive Payment api。 但我们有权使用 GetVerifiedStatus 方法检查特定电子邮件 ID 是否在 PayPal 中拥有帐户。

请使用下面的沙箱 wsdl 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);*/
    

【讨论】:

【参考方案4】:

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

【讨论】:

我正在寻找使用 wsimport 的解决方案。无法使用 Intellij IDEA

以上是关于JAXWS — 如何更改端点地址 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Java 应用程序调用 GraphQL 端点 [重复]

如何更改端点地址以生成 JWT 令牌

如何使用 ZEEP 更改 SOAP 请求中的端点地址

在 SpringBoot 中调用类内部的端点 [重复]

在每次提交中更改邮件地址 [重复]

使用 jQuery 更改浏览器地址栏 URL [重复]