无法使用 GAE Java API 删除域共享联系人
我正在尝试编写一个应用程序,使用 Java API 将域共享联系人添加/更新/删除到 Google。
当我尝试从 Google 删除创建的联系人时,出现以下异常。
没有身份验证标头信息
Caused by:
java.lang.NullPointerException: No authentication header information
at com.google.gdata.util.AuthenticationException.initFromAuthHeader(AuthenticationException.java:96)
at com.google.gdata.util.AuthenticationException.<init>(AuthenticationException.java:67)
at com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java:564)
at com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:543)
at com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:536)
at com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:515)
at com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:515)
at com.google.gdata.client.Service.delete(Service.java:1560)
at com.google.gdata.client.GoogleService.delete(GoogleService.java:691)
at com.google.gdata.data.BaseEntry.delete(BaseEntry.java:647)
at com.visy.connector.synchronizer.impl.ContactSynchronizerImpl.deleteContact(ContactSynchronizerImpl.java:170)
at com.visy.connector.TestServlet.doGet(TestServlet.java:54)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
以下是我用于 deleteContact 的代码
public String deleteContact(String contactId) {
String resultString = "Failed"
ContactEntry contactEntry = getContactFromGoogle(contactId);
try {
if (contactEntry != null) {
// deleting contact from Google
contactEntry.delete();
resultString = "Sucess";
} catch (IOException e) {
LOGGER.log(Level.SEVERE, e.getMessage());
} catch (ServiceException e) {
LOGGER.log(Level.SEVERE, e.getMessage());
}
return resultString;
}
public ContactEntry getContactFromGoogle(String contactId) {
ContactEntry contact = null;
ContactsService myService = getOAuthContactService("getContact");
try {
String urlStr =
http://www.google.com/m8/feeds/contacts/mydomain/full
+ "/" + contactId
+ "?xoauth_requestor_id=" + domainAdminEmail;
contact = myService.getEntry(new URL(urlStr),
ContactEntry.class);
}
} catch (Exception e) {
LOGGER.log(Level.SEVERE, e.getMessage());
}
return contact;
}
public ContactsService getOAuthContactService(String serviceName) {
final ContactsService myService = new ContactsService(serviceName);
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setScope(Scope);
oauthParameters.setOAuthConsumerKey(ConsumerKey);
oauthParameters.setOAuthConsumerSecret(secret); OAuthSigner signer = new OAuthHmacSha1Signer();
try {
myService.setOAuthCredentials(oauthParameters, signer);
} catch (OAuthException e) {
LOGGER.log(Level.SEVERE, e.getMessage());
}
LOGGER.log(Level.INFO, "Created the Authenticated Contact Service");
return myService;
}
在上面的代码中 getContactFromGoogle() 方法返回适当的联系人(根据日志和调试结果)。但是当我调用 contactEntry.delete() 时,会抛出“无身份验证标头信息”异常。
请帮助我找出代码可能出了什么问题。
问候, 尼尔扎里
I am trying to write an application that adds/updates/deletes domain shared contacts in to Google using Java API.
I am getting following exception while I try to delete the created contact from Google.
No authentication header information
Caused by:
java.lang.NullPointerException: No authentication header information
at com.google.gdata.util.AuthenticationException.initFromAuthHeader(AuthenticationException.java:96)
at com.google.gdata.util.AuthenticationException.<init>(AuthenticationException.java:67)
at com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java:564)
at com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:543)
at com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:536)
at com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:515)
at com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:515)
at com.google.gdata.client.Service.delete(Service.java:1560)
at com.google.gdata.client.GoogleService.delete(GoogleService.java:691)
at com.google.gdata.data.BaseEntry.delete(BaseEntry.java:647)
at com.visy.connector.synchronizer.impl.ContactSynchronizerImpl.deleteContact(ContactSynchronizerImpl.java:170)
at com.visy.connector.TestServlet.doGet(TestServlet.java:54)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Following is the code I am using for deleteContact
public String deleteContact(String contactId) {
String resultString = "Failed"
ContactEntry contactEntry = getContactFromGoogle(contactId);
try {
if (contactEntry != null) {
// deleting contact from Google
contactEntry.delete();
resultString = "Sucess";
} catch (IOException e) {
LOGGER.log(Level.SEVERE, e.getMessage());
} catch (ServiceException e) {
LOGGER.log(Level.SEVERE, e.getMessage());
}
return resultString;
}
public ContactEntry getContactFromGoogle(String contactId) {
ContactEntry contact = null;
ContactsService myService = getOAuthContactService("getContact");
try {
String urlStr =
http://www.google.com/m8/feeds/contacts/mydomain/full
+ "/" + contactId
+ "?xoauth_requestor_id=" + domainAdminEmail;
contact = myService.getEntry(new URL(urlStr),
ContactEntry.class);
}
} catch (Exception e) {
LOGGER.log(Level.SEVERE, e.getMessage());
}
return contact;
}
public ContactsService getOAuthContactService(String serviceName) {
final ContactsService myService = new ContactsService(serviceName);
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setScope(Scope);
oauthParameters.setOAuthConsumerKey(ConsumerKey);
oauthParameters.setOAuthConsumerSecret(secret); OAuthSigner signer = new OAuthHmacSha1Signer();
try {
myService.setOAuthCredentials(oauthParameters, signer);
} catch (OAuthException e) {
LOGGER.log(Level.SEVERE, e.getMessage());
}
LOGGER.log(Level.INFO, "Created the Authenticated Contact Service");
return myService;
}
In above code getContactFromGoogle() method is returning the appropriate contact (as per the logs and debug results). But when I invoke contactEntry.delete(), the "No Authentication Header Information" exception is thrown.
Kindly help me to figure out what may have been wrong with the code.
Regards,
Nirzari
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
通过使用 myService.setCredentials(username,password) usermail 或 domainAdminMail 密码
您可以使用以上 3 种方法(用户名、密码、令牌)
检查一下......
catch()块之前的这段代码
By using myService.setCredentials(username,password) usermail or domainAdminMail Password
There are more 3 methods you can use any by using (username,password, token)
check it......
this code before catch() block