2012-06-19 12 views
5

Así que mi próximo problema con este código. Parece que no se encuentra un método y mis ojos no están entrenados. ¿Alguna ayuda disponible sobre esto?Método de Credenciales de Amazon no encontrado

package packeging; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Calendar; 
import java.util.Date; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import com.amazonaws.HttpMethod; 
import com.amazonaws.auth.BasicAWSCredentials; 
import com.amazonaws.services.s3.AmazonS3; 
import com.amazonaws.services.s3.AmazonS3Client; 
import com.amazonaws.auth.BasicAWSCredentials; 
import org.apache.http.*; 
/** 
* Servlet implementation class Hashtastic 
*/ 
@WebServlet("/Hashtastic") 
public class Hashtastic extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    private final static String BUCKET_NAME = "idlatestingbucket";//http://s3.amazonaws.com/THESISDB/techy.jpg 
    private final static String FILE_NAME = "TestPicture/wallpaper-264411.png"; 
    private final static String ACCESS_KEY = "Fakepass"; 
    private final static String SECRET_KEY = "Fakekey"; 
    /** 
    * Default constructor. 
    */ 
    public Hashtastic() { 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
     PrintWriter out = response.getWriter(); 
      Calendar cal = Calendar.getInstance(); 
     cal.add(Calendar.SECOND, 1000); 
     Date expDate = cal.getTime(); 
     out.println(expDate+"\n"); 

     BasicAWSCredentials cre = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY); 
     AmazonS3 s3 = new AmazonS3Client(cre); 
     String url = s3.generatePresignedUrl(BUCKET_NAME, FILE_NAME, expDate, HttpMethod.GET).toString(); 
     out.println(url); 
     out.close(); 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
    } 

} 

Aparece el mensaje 500 de error. Dice que le falta un método. Tengo el jar en mi lib y complementos para eclipse.

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

exception 

javax.servlet.ServletException: Servlet execution threw an exception 


root cause 

java.lang.NoSuchMethodError: org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager: method <init>()V not found 
    com.amazonaws.http.ConnectionManagerFactory.createThreadSafeClientConnManager(ConnectionManagerFactory.java:26) 
    com.amazonaws.http.HttpClientFactory.createHttpClient(HttpClientFactory.java:83) 
    com.amazonaws.http.AmazonHttpClient.<init>(AmazonHttpClient.java:116) 
    com.amazonaws.AmazonWebServiceClient.<init>(AmazonWebServiceClient.java:60) 
    com.amazonaws.services.s3.AmazonS3Client.<init>(AmazonS3Client.java:291) 
    com.amazonaws.services.s3.AmazonS3Client.<init>(AmazonS3Client.java:273) 
    packeging.Hashtastic.doGet(Hashtastic.java:48) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 


note The full stack trace of the root cause is available in the Apache Tomcat/7.0.27 logs. 

¿Algún ayuda?

Respuesta

8

Esto podría suceder si tiene la versión incorrecta del jar httpclient en su classpath, o si tiene más de una versión de ese jar en su classpath (por ejemplo, tener tanto httpclient-4.0.1.jar como httpclient-4.1 .1jar).

También podría ser causado por otro contenedor que contenga una versión diferente de la misma clase. Por ejemplo, sé que gwt-dev.jar contiene una versión de ThreadSafeClientConnManager. Si este es el caso, el problema probablemente podría resolverse ajustando el orden de ruta de compilación para poner httpclient.jar antes de gwt-dev.jar (o el otro jar que causa el problema).

+0

Sí, lo descubrí casi al mismo tiempo que lo publicaste. ¡Fue ese el problema exacto de todos modos gracias por la ayuda! – ThreeFold

+0

También puede suceder si el servidor de aplicaciones como Websphere 8 incluye una versión anterior a httpclient-4.1.x porque fue en 4.1 que se implementó el constructor predeterminado. En este caso, debe cambiar la política de carga de clases en su aplicación de PARENT_FIRST a PARENT_LAST e incluir un 4.1+ JAR en su EAR/WAR. –

3

Por experiencia con esta misma Excepción exacta, las posibilidades son bastante buenas de que sea causada por gwt-dev que aparece antes de aws-java-sdk en su classpath y debido a que gwt-dev contiene un conflicto (en términos de carga de clases) versión de org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager

Si está usando Maven, vuelva a solicitar sus dependencias de la siguiente manera y tal vez agregue una advertencia a los compañeros de mantenimiento sobre la importancia del pedido.

<dependency> 
    <groupId>com.amazonaws</groupId> 
    <artifactId>aws-java-sdk</artifactId> 
    <version>1.3.26</version> 
</dependency> 

<dependency> 
    <groupId>com.google.gwt</groupId> 
    <artifactId>gwt-dev</artifactId> 
    <version>2.3.0</version> 
</dependency>