与AWS的SimpleDB从的Java Servlet创建域SimpleDB、AWS、Servlet、Java

2023-09-11 11:20:33 作者:甘心垫底衬你的高贵

我是一名大学生工作的一个研究项目,涉及迁移Web应用程序以亚马逊的云。我花了上个学期在使用Servlet,并能得到广大的应用程序的功能使用的Java Servlet在Tomcat的运行工作。

我现在正在试图整合亚马逊网络服务,如SimpleDB的和电子邮件服务。我开发使用Eclipse的Java EE的Web开发人员靛蓝IDE。我已经安装了AWS插件,我能够运行示例code,亚马逊提供了调用深发展和SES成功。

然而,当我试图直接或通过我收到以下错误一个单独的类来调用从servlet像SimpleDB的服务:

       

HTTP状态500 -

        

类型异常报告

     

消息

     

说明服务器遇到内部错误()pvented了$ P $   它满足了这一请求。

     

除了

     

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)根本原因

     

java.lang.NoClassDefFoundError的:COM / amazonaws /认证/ AWSCredentials     java.lang.Class.getDeclaredConstructors0(本机方法)     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(本机方法)     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)注完整的堆栈跟踪   根本原因是在Apache Tomcat的/ 7.0.23日志可用。

     

的Apache Tomcat / 7.0.23

我的code是这样的:

 包org.comtor.cloud.api;

进口java.io. *;
进口javax.servlet.http包*。
导入的javax.servlet。*;

进口com.amazonaws.auth.BasicAWSCredentials;
进口com.amazonaws.services.simpledb.AmazonSimpleDBClient;
进口com.amazonaws.services.simpledb.model.CreateDomainRequest;

进口java.io.IOException异常;

@燮pressWarnings(串行)
公共类APIservlet延伸的HttpServlet {
  公共无效的doGet(HttpServletRequest的要求,
                     HttpServletResponse的响应)
    抛出了ServletException,IOException异常
  {
      的doPost(请求,响应);
  }
  公共无效的doPost(HttpServletRequest的要求,
          HttpServletResponse的响应)
                  抛出了ServletException,IOException异常{
        PrintWriter的输出= response.getWriter();

        // AWS证书
        字符串sAccessKey =myAccessKey;
        字符串sSecretKey =mySecretKey;

        //验证AWS账户
        BasicAWSCredentials oAWSCredentials =新BasicAWSCredentials(sAccessKey,sSecretKey);
        AmazonSimpleDBClient awsSimpleDBClient =新AmazonSimpleDBClient(oAWSCredentials);

        //尝试访问的SimpleDB
        尝试
        {
            的System.out.println(连接到简单的数据库);
            //创建一个域
            字符串myDomain的=的MyStore;
            的System.out.println(创建域称为+ myDomain的+\ñ);
            awsSimpleDBClient.createDomain(新CreateDomainRequest(myDomain的));
            的System.out.println(作了);

        }
        //打印错误堆栈跟踪
        赶上(抛出:NoSuchAlgorithmException E)
        {
            e.printStackTrace();
        }

        //关闭的PrintWriter
        out.close();
  }
}
 

**访问和放大器;密钥由code删除**

这同样适用于SES。我也尝试过使用的Java库像typica',仍然收到NoClassDef错误。我在我的构建路径的AWS库下的库文件夹和jar包/班似乎是在那里。所以我不确定为什么我不能使用这些类从我的servlet与SimpleDB的交互。

我会非常AP preciate在这个问题上的任何帮助。我相信,我不完全理解如何从网络环境调用AWS深发展。

感谢你。

解决方案

抛出java.lang.ClassNotFoundException:com.amazonaws.auth.AWSCredentials表明这个类是不是在你的类路径中。确保包含com.amazonaws.auth.AWSCredentials类的jar包含在你的web应用程序的WEB-INF / lib文件夹。

Java开发中 API接口不用写 Controller也可以

I am a university student working on a research project that involves migrating a web application to Amazon's cloud. I spent the last semester working with servlets and was able to get the majority of the app's functionality working using a java servlet running in Tomcat.

I am now trying to integrate Amazon Web Services such as the SimpleDB and E-mail service. I develop using the Eclipse Java EE for Web Developers Indigo IDE. I have the AWS plugin installed and am able to run sample code that Amazon provides to call SDB and SES successfully.

However when I attempt to call a service like simpleDB from the servlet either directly or through a separate class I receive the following error:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Error instantiating servlet class 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 cause

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) root cause

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.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) note The full stack trace of the root cause is available in the Apache Tomcat/7.0.23 logs.

Apache Tomcat/7.0.23

My code looks like this:

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();
  }
}

** Access & Secret Keys removed from code **

The same goes for SES. I have also tried using a java library like 'typica' and still receive a NoClassDef error. I have the AWS library in my build path under the libraries folder and the jar package / classes seem to be there. So I am unsure why I am unable to use these classes to interact with simpleDB from my servlet.

I'd greatly appreciate any help on this matter. I believe I am not fully understanding how to call AWS SDB from a web environment.

Thank you.

解决方案

java.lang.ClassNotFoundException: com.amazonaws.auth.AWSCredentials indicates that this class is not on your classpath. Make sure that the jar containing the com.amazonaws.auth.AWSCredentials class is included in your web application's WEB-INF/lib folder.