我通过扩展DefaultHttpInvoker类来实现自定义Http invocker。之后,我使用自定义调用程序实现创建了会话。
sessionParams.put(SessionParameter.HTTP_INVOKER_CLASS, CustomInvokerImplementation.class.getName());
当我使用会话查询某些数据时,它正在调用DefaultHttpInvoker post方法。
ItemIterable queryResults = session.query(“MyQuery”,false,session.getDefaultContext());
我对此做了一些分析。最后,我的请求最终调用'org.apache.chemistry.opencmis.client.bindings.spi.browser.AbstractBrowserBindingService.java'的post方法
protected Response post(UrlBuilder url, String contentType, Output writer) {
// make the call
Response resp = getHttpInvoker().invokePOST(url, contentType, writer, session);
// check response code
if (resp.getResponseCode() != 200 && resp.getResponseCode() != 201) {
throw convertStatusCode(resp.getResponseCode(), resp.getResponseMessage(), resp.getErrorContent(), null);
}
return resp;
}
getHttpInvoker method imeplemented like below.
protected HttpInvoker getHttpInvoker() {
return CmisBindingsHelper.getHttpInvoker(session);
}
从以下代码中我了解到,HttpInvocker是使用'HTTP_INVOKER_OBJECT'创建的,如果它无法使用'HTTP_INVOKER_OBJECT'获取HttpInvocker对象, 它正在试用'SessionParameter.HTTP_INVOKER_CLASS'。
public static HttpInvoker getHttpInvoker(BindingSession session) {
assert session != null;
HttpInvoker invoker = (HttpInvoker) session.get(HTTP_INVOKER_OBJECT);
if (invoker != null) {
return invoker;
}
session.writeLock();
try {
// try again
invoker = (HttpInvoker) session.get(HTTP_INVOKER_OBJECT);
if (invoker != null) {
return invoker;
}
// ok, we have to create it...
try {
String invokerName = (String) session.get(SessionParameter.HTTP_INVOKER_CLASS);
invoker = (HttpInvoker) ClassLoaderUtil.loadClass(invokerName).newInstance();
} catch (CmisBaseException e) {
throw e;
} catch (Exception e) {
throw new CmisRuntimeException("HTTP invoker cannot be initialized: " + e.getMessage(), e);
}
// we have an Invoker object -> put it into the session
session.put(HTTP_INVOKER_OBJECT, invoker, true);
} finally {
session.writeUnlock();
}
assert invoker != null;
return invoker;
}
有什么办法,我应该让它调用我的自定义HttpInvocker实现。