ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java-JAX-WS和SharePoint用户组Web服务

2019-12-09 05:02:55  阅读:346  来源: 互联网

标签:jax-ws web-services java sharepoint


我有一个小应用程序,可以查询我们的SharePoint服务器的Web服务界面以获取组中所有用户的列表.
我可以看到原始的HTTP响应将与列出的所有用户一起返回,但是JAX-WS响应对象(在NetBeans 6.9下创建)仅包含一个空白的Group Name String值. HTTP响应中没有跟踪所有用户名.

有人知道为什么JAX-WS无法正确读取SOAP响应吗?

WSDL已经发布很久了,但是可以从各个位置(包括此站点)进行广泛访问:
http://www.hezser.de/_vti_bin/UserGroup.asmx?wsdl

这是原始HTTP响应的开始:

---[HTTP response - http://{server}/_vti_bin/usergroup.asmx - 200]---
null: HTTP/1.1 200 OK
Cache-control: private, max-age=0
Content-type: text/xml; charset=utf-8
Content-length: 136738
X-powered-by: ASP.NET
Server: Microsoft-IIS/6.0
Date: Wed, 22 Sep 2010 20:53:12 GMT
X-aspnet-version: 2.0.50727
Set-cookie: WSS_KeepSessionAuthenticated=80; path=/
Microsoftsharepointteamservices: 12.0.0.6303
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetUserCollectionFromGroupResponse xmlns="http://schemas.microsoft.com/sharepoint/soap/directory/"><GetUserCollectionFromGroupResult><GetUserCollectionFromGroup><Users><User ID="201" Sid="S-1-5-21-1545385408-2720673749-3828181483-1245" ....

解决方法:

您需要在生成存根之前手动编辑UserGroup.wsdl.您需要将processContents =’skip’添加到< s:any>定义响应的标签.

<s:element name="GetUserCollectionFromGroupResponse">
 <s:complexType>
  <s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="GetUserCollectionFromGroupResult">
      <s:complexType mixed="true">
        <s:sequence>
          <!-- Added the "processContents" attribute below -->
          <s:any processContents='skip' />    
        </s:sequence>
      </s:complexType>
    </s:element>
  </s:sequence>
 </s:complexType>
</s:element>

然后,当处理响应时,JAXB将把子元素作为DOM元素返回:

UserGroup service = new UserGroup();
UserGroupSoap port = service.getUserGroupSoap();

GetUserCollectionFromGroupResult usersCollection = port.getUserCollectionFromGroup(Settings.usersGroup);
List<Object> content = usersCollection.getContent();
org.w3c.dom.Element usersElement = (org.w3c.dom.Element) content.get(0);

为什么这样做

该问题是由多种情况引起的:

A. Web服务返回的响应包含< GetUserCollectionFromGroup>.标签:

<GetUserCollectionFromGroupResult>
    <GetUserCollectionFromGroup>
       <Users>
          <User ID="4" Name="User1_Display_Name" />
          <User ID="5" Name="User2_Display_Name" />
       </Users>
    </GetUserCollectionFromGroup>
</GetUserCollectionFromGroupResult>

B.嵌入WSDL的模式定义了< GetUserCollectionFromGroup>.包含一个孩子,< groupName> (这是用于发出请求的元素):

<s:element name="GetUserCollectionFromGroup">
  <s:complexType>
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string"/>
    </s:sequence>
  </s:complexType>
</s:element>

C. JAXB支持< xs:any>的processContents属性. (请参阅Mapping of <xs:any />).当processContents =’strict’时,JAXB尝试根据子元素所属的名称空间匹配(并编组)子元素.

D.< GetUserCollectionFromGroupResult>的WSDL模式定义.包括< xs:any&gt ;:

<s:element name="GetUserCollectionFromGroupResponse">
 <s:complexType>
  <s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="GetUserCollectionFromGroupResult">
      <s:complexType mixed="true">
        <s:sequence>
          <s:any/>
        </s:sequence>
      </s:complexType>
    </s:element>
  </s:sequence>
 </s:complexType>
</s:element>

E.当省略processContents时,默认值为strict.

因此,当JAX-WS / JAXB处理来自Web服务的结果时,它将尝试编组< GetUserCollectionFromGroupResult>的子级.使用架构.子级在响应中显示为与请求属于同一名称空间.当< GetUserCollectionFromGroup>元素被处理后,将被编组为< GetUserCollectionFromGroup>请求中使用的同一类的实例.元件.因此,有效地阻止了您到达< Users>用户.元素.

我已经搜索了高低,我唯一能找到的解决方案是以太(a)按照此答案开头所述的那样编辑WSDL,或(b)编辑生成的存根.不理想,但在这种情况下是不可避免的.

有关< xs:any>的更多信息.模式元素(和processContents属性)可以在MSDN here上找到.

标签:jax-ws,web-services,java,sharepoint
来源: https://codeday.me/bug/20191209/2096528.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有