2012-06-19 24 views
5

Więc mój następny problem z tym kodem. Wygląda na to, że nie znajduje metody, a moje oczy są nieprzeszkolone. Każda pomoc dostępna na ten temat?Nie znaleziono metody Amazon Credentials

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 
    } 

} 

Otrzymuję ten błąd 500. Mówi, że brakuje mu metody. Mam słoik w mojej lib i wtyczki do 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. 

Każda pomoc?

Odpowiedz

8

Może się to zdarzyć, jeśli masz niewłaściwą wersję słoika httpclient w swojej ścieżce klasy lub jeśli masz więcej niż jedną wersję tego słoika w ścieżce klasy (np. Mając zarówno httpclient-4.0.1.jar, jak i httpclient-4.1 .1.jar).

Może to być również spowodowane przez inny słoik zawierający inną wersję tej samej klasy. Na przykład wiem, że plik gwt-dev.jar zawiera wersję ThreadSafeClientConnManager. W takim przypadku problem można prawdopodobnie rozwiązać, dostosowując kolejność budowania ścieżki, aby umieścić plik httpclient.jar przed plikiem gwt-dev.jar (lub innym problemem powodującym słoik).

+0

Tak, wymyśliłem to mniej więcej w tym samym czasie, co Ty. To był dokładny problem, w każdym razie dzięki za pomoc! – ThreeFold

+0

Może się również zdarzyć, jeśli serwer aplikacji, taki jak Websphere 8, zawiera starszą wersję niż httpclient-4.1.x, ponieważ był w wersji 4.1, ten domyślny konstruktor został zaimplementowany. W takim przypadku należy zmienić zasady ładowania klas w aplikacji z PARENT_FIRST na PARENT_LAST i dodać plik 4.1+ JAR w pliku EAR/WAR. –

3

Z doświadczenia z tym samym Wyjątkiem wynika, że ​​szanse są całkiem dobre, ponieważ jest spowodowany przez gwt-dev pojawiający się przed aws-java-sdk w swojej ścieżce klasowej i ze względu na to, że gwt-dev zawiera konflikt (pod względem klasy obciążenia) wersja org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager

Jeśli używasz Mavena, uporządkuj swoje zależności w następujący sposób i być może dodaj ostrzeżenie dla innych opiekunów na temat znaczenia zamawiania.

<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> 
Powiązane problemy