使用Java的例子通过Java来消费SharePoint的Web Services,没有太大的不同;基础步骤基本是相同的,从我提供的XSD中生成我们的类,生成Web Services 代理,并构建应用程序。通过Java来消费SharePoint的Web Services,你所要面对的大部分挑战是登录验证和SharePoint的Web Services中的DataSet的使用。有大量的Java IDE可以简化Web Services的操作,但是由于我目前我主要工作于.NET中,所以我将演示一个使用SDK的例子,而在这个例子中对于IDE选择只好留给你了。
注意:: 这个例子是使用J2SE 6.0 Update 3来构建和测试的。

附件:
您所在的用户组无法下载或查看附件Java SharePoint示例项目目录和根文件完整的项目和生成文件包含了一些批处理文件以便构建和运行这个例子。你需要编辑"xjc-build.bat"和"build-run.bat",设置其中的HOME变量为你的JDK的安装目录,以便能正常运行这些批处理文件;另外,在构建和运行示例之前,还要使用你的服务器配置信息(端点、用户名和密码)来编辑 wsspsample/Main.java。
导入服务的WSDL由于几个原因,我一开始就把WSDL从我的SharePoint服务器上取到了我的开发机器上。首先,我需要编辑使用ADO.NET数据集的任何 WSDL,以使相关工具能正确处理它。其次,访问位于SharePoint服务器上的WSDL一般需要进行验证,而Java生成的代理在构造器中就需要访问WSDL,这会为我带来一些验证方面的问题。
获取搜索服务的WSDL在Internet Explorer打开Windows SharePoint Services 3.0的搜索服务,并导航到“
Error! Hyperlink reference not valid”上,然后从File菜单中选择Save As...,把这个这个页面保存到工作目录中,命名为spsearch.wsdl。如果你工作于MOSS 2007,那么你将使用“
Error! Hyperlink reference not valid”。
编辑搜索服务的WSDLMOSS 2007的QueryEx方法和GetSearchMetaData方法都返回了ADO.NET数据集。ADO.NET数据集是动态包装和表示WSDL中对Schema属性的循环引用的,所以这会引起我们使用的JAXB wsimport工具的一些问题。我发现这个问题在Java JDK以前的版本能正常处理,反而我现在使用的这个版本不正常。不过,我选择通过在记事本中编辑WSDL来解决这个问题,就是在“element”元素中查找ref为"s:schema的"实例,然后删除循环引用并保留Schema中的“any”元素。

Code
<s:sequence>
<s:element ref="s:schema"/>
<s:any/>
</s:sequence>
被更改为如下格式:

Code
<s:sequence>
<s:any minOccurs="0" maxOccurs="unbounded"/>
</s:sequence>
导入WSDL现在,我们已经有一个本地的WSDL文件了,并进行了恰当的修改,这样我们就可以使用JAXB的wsimport.exe工具来生成代理类了。

Code
wsimport -p wsspsample.webref.spsearch -keep spsearch.wsdl
wsimport -p wsspsample.webref.search -keep search.wsdl
我们使用-keep标志,在导入的时候可以保留java代码以便我们能为我们的应用程序调整生成的代码。这个工具使用绝对路径来生成代码,所以如果你打算移动应用程序到不同的目录下,并把WSDL和应用程序一起进行保存,那么我们需要编辑"webref\search \QueryService.java"的Url,并自己构造它。为了解决这个问题,我们只需简单地使用相对路径来代替绝对路径。

Code
url = new URL("file:search.wsdl");
生成请求响应类为了生成请求和响应类,你需要使用4个我创建好的"Microsoft.Search"XSD文件,以及JAXB的xjc.exe工具。在下面,我们取消了包级别标注的生成过程,而是指定了一个目标包,并用这个工具创建出我们需要的类。

Code
xjc -npa -p wsspsample.xom.query -d . Microsoft.Search.Query.xsd
xjc -npa -p wsspsample.xom.response -d . Microsoft.Search.Response.xsd
使用生成的类我们已经有了代表传递到和从QueryService服务的Query方法返回的查询和响应数据包的类,以及Query服务的代理。现在,是时候来把它们用于应用程序里了。我们需要做的第一件事情是创建QueryService的实例,这个对象的构造器将获取我们本地的WSDL副本,并加载其中的设置。从 QueryService实例中,我们能通过getQueryServiceSoap方法获取到QueryServiceSoap的实例。注意,你需要保持getQueryServiceSoap的实例,并在我们处理qsp变量的时候使用它,这是因为getQueryServiceSoap方法总是会返回新的实例。在这里我们能编辑端点地址,以便实现比WSD所包含功能更多的事情,这样可以让我们的应用程序更加灵活,从而允许这个应用程序能连接到WSDL 中未设置的其他SharePoint站点和子站点上。

Code
QueryService qs = new QueryService();
QueryServiceSoap qsp = qs.getQueryServiceSoap();
BindingProvider bp = (BindingProvider)qsp;
//bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "Administrator");
//bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "pass@word1");
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://barbie/_vti_bin/spsearch.asmx");
现在,我们创建序列化查询数据包和反序列化响应数据包的方法。

Code
public static String SerializeQuery(QueryPacket qp)
{
try
{
JAXBContext jc =JAXBContext.newInstance("wsspsample.xom.query");
Marshaller ma = jc.createMarshaller();
ma.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
ByteArrayOutputStream os = new ByteArrayOutputStream();
ma.marshal(qp, os);
return os.toString();
}
catch(JAXBException ex)
{
return "";
}
}
public static ResponsePacket DeserializeResponse(String s)
{
try
{
JAXBContext jc = JAXBContext.newInstance("wsspsample.xom.response");
Unmarshaller um = jc.createUnmarshaller();
StreamSource source = new StreamSource(new StringReader(s));
return (ResponsePacket)um.unmarshal(source);
}
catch (JAXBException ex)
{
return new ResponsePacket();
}
}
从这里开始,我们要来创建QueryPacket和所需的类,设置相关的值并调用服务。

Code
// Create a Search Query Packet Object
QueryPacket qp = new QueryPacket();
QueryType qt = new QueryType();
ContextType ct = new ContextType();
QueryTextType ctt = new QueryTextType();
ct.setQueryText(ctt);
qt.setContext(ct);
qp.setQuery(qt);
// Set search values
ctt.setValue("sharepoint");
ctt.setType("STRING"); //This is the default - not necessary
ctt.setLanguage("en-us"); //This is the default - not necessary
// Call the web service query
String sResponse = qsp.query(SerializeQuery(qp));
// Deserialize the response
ResponsePacket resp = DeserializeResponse(sResponse);
构建并运行应用程序我们已经拥有了生成的Web Services代理和查询请求和响应的对象模型,已经使用它们的应用程序,现在我们只需要简单地动下手指头,即可对其进行构建、运行和测试。你需要一个配置好的SharePoint服务器,并在Main.java中设置正确的端点地址,以及能正确测试SharePoint服务器的登录凭据。
参考和链接
Windows SharePoint Services 3.0 Web Services Reference.