当前位置: 首页 > 面试题库 >

JAX-WS-添加SOAP标头

伍玮
2023-03-14
问题内容

我正在尝试创建一个独立的客户端来使用某些Web服务。我必须将我的用户名和密码添加到SOAP Header。我尝试添加凭据,如下所示:

OTSWebSvcsService service = new OTSWebSvcsService();
OTSWebSvcs port = service.getOTSWebSvcs();

BindingProvider prov = (BindingProvider)port;
prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "myusername");
prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "mypassword");

...

当我在服务上调用方法时,出现以下异常:

com.ibm.wsspi.wssecurity.SoapSecurityException: WSEC5048E: One of "SOAP Header" elements required.

我究竟做错了什么?如何将这些属性添加到SOAP Header?

编辑:我正在使用JDK6中包含的JAX-WS 2.1。我现在正在使用JAX-WS 2.2。我现在得到以下异常:

com.ibm.wsspi.wssecurity.SoapSecurityException: WSEC5509E: A security token whose type is [http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken] is required.

如何创建此令牌?


问题答案:

不是100%肯定,因为该问题缺少一些详细信息,但是如果您使用的是JAX-WS
RI,请查看发送请求时添加SOAP标头:

进行此操作的可移植方法是您创建一个SOAPHandlerSAAJ并与之混淆,但是RI提供了一种更好的方法。

创建代理或调度对象时,它们将实现 BindingProvider接口。使用JAX-WS RI时,您可以向下转换到
WSBindingProvider它,以定义仅由JAX-WS RI提供的更多方法。

该接口允许您设置任意数量的Header对象,每个对象代表一个SOAP标头。如果需要,您可以自己实现它,但是很可能您会使用在Headers类中定义的工厂方法
之一来创建一个。

>     import com.sun.xml.ws.developer.WSBindingProvider;
>  
>     HelloPort port = helloService.getHelloPort();  // or something like
> that...
>     WSBindingProvider bp = (WSBindingProvider)port;
>  
>     bp.setOutboundHeader(
>       // simple string value as a header, like
> <simpleHeader>stringValue</simpleHeader>
>       Headers.create(new QName("simpleHeader"),"stringValue"),
>       // create a header from JAXB object
>       Headers.create(jaxbContext,myJaxbObject)
>     );

相应地更新您的代码,然后重试。并且,如果您不使用JAX-WS RI,请更新您的问题并提供更多上下文信息。

更新: 似乎您要调用的Web服务已通过WS-Security /
UsernameTokens保护。这与您最初提出的问题有些不同。无论如何,要配置您的客户端发送用户名和密码,我建议查看一下很棒的文章,为基于Metro的Web服务实现WS-Security UsernameToken Profile(跳至步骤4)。使用NetBeans进行此步骤可能会大大简化工作。



 类似资料:
  • 问题内容: 目标 我正在为相当老的(但可悲的是不可更改)的接口实现Web服务。我有一个问题,正在调用我的服务的客户端期望SOAP响应中有某个命名空间,而我很难更改它以使其匹配。 考虑一个世界的例子,我想要这样: 看起来像这样: 我在这里找到了与尝试执行的操作类似的操作,但是在使相似的代码正确执行方面遇到困难。(我想坚持使用Metro,而不必更改为cxf或axis) 执行 我的实现返回如下所示: 该

  • JAX-WS (JavaTM API for XML-Based Web Services)规范是一组XML web services的JAVA API。JAX-WS允许开发者可以选择RPC-oriented或者message-oriented 来实现自己的web services。 在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP。在使用JAX-WS过程中,开发者不需要

  • 我正在为一个相当旧(但遗憾的是无法更改)的接口实现一个web服务。我遇到了一个问题,即调用我的服务的客户端需要SOAP响应中的某个命名空间,而我很难将其更改为匹配。 考虑一个hello world示例,我希望这样: 看起来像这样: 我发现了一些类似于我在这里尝试做的事情,但我很难正确执行类似的代码。(我想继续使用Metro,而不必更换cxf或axis) 我的返回< code > jaxbconte

  • Apache CXF WebService 没有话说,享受沉默 showcase项目已演示了JAX-WS2.0 + CXF 的最重要特性, 其中客户端在测试用例里. SOAP这个名字,本身就是个笑话,一点都不Simple。其他一些WS-*协议,包括安全,附件等都不再看好,因此SpringSide4.0没什么更新。 测试工具依然是SoapUI。 Tips 1. CXF自动生成的WSDL与WADL文件

  • 问题内容: 我有一个来自oracle的NO.net Web服务,要访问,我需要添加soap标头。如何在Java中添加soap标头? 这有必要吗? 我的肥皂标头是这样的: 问题答案: 我做到了,只需按照本教程进行即可。很有帮助 是来自javadb的副本(因为已关闭) http://informatictips.blogspot.pt/2013/09/using-message-handler-to-

  • 问题内容: 所以我有一个简单的Web服务: 书的类也很简单: 现在,当您在浏览器的测试器中调用此Web服务时,我得到: 是否有可能将返回的 HashMap 对象显示在标记中,例如 我想要返回标签中的值的原因是,从客户端来看,我在网页中使用jQuery AJAX调用此Web服务,而我得到的响应XML只是空标签。我如何从AJAX客户端获得真实的账面价值? 这是我的AJAX网络代码: 我使用简单的Hel