我已经想通了。
我的最终目标是创建一个可以移植到 WebSphere Application Server v8.0 的简单测试用例。Apache Wink 客户端无法自行处理 NTLM 身份验证。您必须使用单独的 Http 客户端来处理 NTLM 身份验证。我选择了 Apache Http Cient v4.0.1,因为那个有缺陷的版本打包在 WAS v8.0 中。覆盖提供的版本也是一个巨大的痛苦。这就是为什么我没有选择更新、更好的 Apache HttpClient 版本的原因。
因此,以下是获取 Apache Http Client v4.0.1 来处理 NTLM 身份验证的方法:使用以下依赖项...
<dependency>
<groupId>jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.17</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.wink</groupId>
<artifactId>wink-client</artifactId>
<version>1.4</version>
</dependency>
我正在使用 WAS v8.0 中包含的 com.ibm.ws.prereq.jaxrs.jar 来获取 Apache Http Client v4.0.1。它安装在我的 Maven 存储库中,我将其指定为获取 Http Client v4.0.1 的依赖项。
按照此处的步骤操作。
现在,Wink 开始发挥作用:
public int attemptWinkHttpClienGET() {
ClientResponse response = null;
try {
String spUri = "https://some-sharepoint-url/listdata.svc/";
StringBuilder sb = new StringBuilder();
sb.append(spUri).append("UserInformationList").toString();
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.getAuthSchemes().register("ntlm",new JCIFSNTLMSchemeFactory());
CredentialsProvider credsProvider = new BasicCredentialsProvider();
NTCredentials ntcred = new NTCredentials("username_here", "password_here", InetAddress.getLocalHost().getHostName(), "domain_here");
credsProvider.setCredentials(new AuthScope("base_url_here_sans_https://", 443, AuthScope.ANY_REALM, "NTLM"), ntcred);
httpClient.setCredentialsProvider(credsProvider);
org.apache.wink.client.ClientConfig httpClientConfig = new org.apache.wink.client.ApacheHttpClientConfig(httpClient);
Application app = new Application() {
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(WinkMOXyJsonProvider.class);
return classes;
}
};
httpClientConfig.applications(app);
RestClient client = new RestClient(httpClientConfig);
Resource resource = client.resource(sb.toString());
response = resource.accept(MediaType.APPLICATION_JSON_TYPE).get();
UserInformationListResponse blah = response.getEntity(UserInformationListResponse.class);
Results[] results = blah.getD().getResults();
for (Results result : results) {
System.out.println("User Name: " + result.getFirstName() + " " + result.getLastName());
}
System.out.println("The response is " + response.getStatusCode());
response.consumeContent();
} catch (UnknownHostException ex) {
Logger.getLogger(HttpTest.class.getName()).log(Level.SEVERE, null, ex);
}
return response.getStatusCode();
}
现在,最后一点。我使用 MOXy 作为我的 JAXB 实现。即使我在我的应用程序变量中注册它,我也遇到了一些问题。我看到了一些与杰克逊有关的错误。Apache HttpClient v4.0.1 显然在后台使用 Jackons 作为默认值。这是我为克服这个问题所做的。
我添加了以下依赖项:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.4.0-rc2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-xc</artifactId>
<version>1.9.13</version>
</dependency>
这是 WinkMOXyJsonProvider.java
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.Provider;
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;
@Provider
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class WinkMOXyJsonProvider extends MOXyJsonProvider {
}
我观察了从 Sharepoint 返回的字符串结果,然后创建了一堆模仿 JSON 对象层次结构的 MOXy POJO。