使用Java Servlet从AWS SimpleDB创建域

我是一名研究项目的大学生,涉及将Web应用程序迁移到亚马逊云。 我花了最后一个学期与servlet一起工作,并且能够使用在Tomcat中运行的java servlet来获得应用程序的大部分function。

我现在正在尝试集成Amazon Web Services,例如SimpleDB和电子邮件服务。 我使用Eclipse Java EE for Web Developers Indigo IDE进行开发。 我安装了AWS插件,并且能够运行Amazon提供的示例代码,以便成功调用SDB和SES。

但是,当我尝试直接或通过单独的类从servlet调用simpleDB等服务时,我收到以下错误:

HTTP状态500 –

类型exception报告

信息

description服务器遇到内部错误(),导致无法完成此请求。

例外

javax.servlet.ServletException:实例化servlet类时出错org.comtor.cloud.api.APIservlet org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve .java:98)org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)org.apache.coyote.http11.AbstractHttp11Processor .process(AbstractHttp11Processor.java:987)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:539)org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:298)java .util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)java.lang.Thread.run(Thread.java:680)root原因

java.lang.NoClassDefFoundError:com / amazonaws / auth / AWSCredentials java.lang.Class.getDeclaredConstructors0(Native Method)java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)java.lang.Class.getConstructor0(Class.java: 2699)java.lang.Class.newInstance0(Class.java:326)java.lang.Class.newInstance(Class.java:308)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)org。 apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 407)org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:539)org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:298)java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)java.util。 concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)java.lang.Thread.run(Thread.java:680)根本原因

java.lang.ClassNotFoundException:com.amazonaws.auth.AWSCredentials org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1688)org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1533)java .lang.Class.getDeclaredConstructors0(Native Method)java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)java.lang.Class.getConstructor0(Class.java:2699)java.lang.Class.newInstance0(Class.java: 326)java.lang.Class.newInstance(Class.java:308)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 98)org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)org.apache.coyote.http11.AbstractHttp11Processor.process( AbstractHttp11Processor.java:987)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:539)org.a pache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:298)java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)java.util.concurrent.ThreadPoolExecutor $ Worker.run( ThreadPoolExecutor.java:908)java.lang.Thread.run(Thread.java:680)注意Apache Tomcat / 7.0.23日志中提供了根本原因的完整堆栈跟踪。

Apache Tomcat / 7.0.23

我的代码如下所示:

package org.comtor.cloud.api; import java.io.*; import javax.servlet.http.*; import javax.servlet.*; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpledb.AmazonSimpleDBClient; import com.amazonaws.services.simpledb.model.CreateDomainRequest; import java.io.IOException; @SuppressWarnings("serial") public class APIservlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); // AWS Credentials String sAccessKey = "myAccessKey"; String sSecretKey = "mySecretKey"; // Authenticate AWS account BasicAWSCredentials oAWSCredentials = new BasicAWSCredentials(sAccessKey, sSecretKey); AmazonSimpleDBClient awsSimpleDBClient = new AmazonSimpleDBClient(oAWSCredentials); // Try to access simpleDB try { System.out.println("Connecting to Simple Database"); // Create a domain String myDomain = "MyStore"; System.out.println("Creating domain called " + myDomain + ".\n"); awsSimpleDBClient.createDomain(new CreateDomainRequest(myDomain)); System.out.println("Connection Made"); } // Print Error Stack Trace catch (NoSuchAlgorithmException e) { e.printStackTrace(); } // Close PrintWriter out.close(); } } 

**从代码中删除访问和密钥**

SES也是如此。 我也尝试使用像’typica’这样的java库,但仍然收到NoClassDef错误。 我在我的构建路径中的库文件夹下有一个AWS库,jar包/类似乎就在那里。 所以我不确定为什么我无法使用这些类与我的servlet中的simpleDB进行交互。

我非常感谢你对此事的任何帮助。 我相信我并不完全了解如何从Web环境调用AWS SDB。

谢谢。

java.lang.ClassNotFoundException:com.amazonaws.auth.AWSCredentials表示此类不在您的类路径中。 确保包含com.amazonaws.auth.AWSCredentials类的jar包含在Web应用程序的WEB-INF / lib文件夹中。

Interesting Posts