2012-05-09 37 views
6

Mam ten prosty kawałek kodu, który próbuje przesłać plik do Amazon S3 za pośrednictwem serwera proxy. Jest to kod:Klient Amazon S3 łączy się za pośrednictwem proxy - putObject pobiera NullPointerException

BasicAWSCredentials basicCred = new BasicAWSCredentials("my_access_key", "my_secret_key"); 
    ClientConfiguration clientCfg = new ClientConfiguration(); 
    clientCfg.setProtocol(Protocol.HTTP); 

    //setup proxy connection: 
    clientCfg.setProxyHost("192.168.2.12"); 
    clientCfg.setProxyPort(80); 




    AmazonS3 s3 = new AmazonS3Client(basicCred, clientCfg); 


    String bucketName = "mybucket"; 
    String key = "/test/Capture.JPG"; 
    File file = new File("d:/Test_Data/Capture.JPG"); 

    System.out.println("Uploading a new object to S3 from a file"); 
    s3.putObject(new PutObjectRequest(bucketName, key, file)); 

Jednak jest to błąd dostałem od uruchomienia programu:

Exception in thread "main" java.lang.NullPointerException 
    at com.amazonaws.util.BinaryUtils.fromHex(BinaryUtils.java:69) 
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1066) 
    at javaapplication8.JavaApplication8.main(JavaApplication8.java:48) 
Java Result: 1 

Używam najnowsze AWS 1.3.8 SDK od Amazon. Proxy jest ustawione na innym komputerze obok mnie i to tylko prosty serwer proxy JavaScript (http://www.catonmat.net/http-proxy-in-nodejs/)

Nie mogę zrozumieć dlaczego . Ktoś może mi pomóc, proszę?

+0

Po dalszych badaniach okazało się, że był to hexData jest null w funkcji: public static byte [] fromHex (String hexData) od linii BinaryUtils.java 69. Czy są to inne sposoby, dzięki którym mogę uzyskać więcej informacji na temat debugowania? – Eugene

+0

AKTUALIZACJA: Miałem ten sam problem z AWS SDK 1.6.7, wydaje się, że wszystko działa teraz po aktualizacji do 1.9.35 – sscarduzio

Odpowiedz

3

Wpadłem również na ten problem. Przeanalizowałem wszystko w debugerze i odkryłem, że przyczyną problemu jest kod klienta Amazon S3, oczekujący znacznika nagłówka o nazwie "ETag", ale odpowiedź zawiera "Etag", z małą literą "t".

Nagłówki są wprowadzane do Map<String,String>, więc gdy kod klienta Amazon S3 wzywa get("ETag"), to wróci null, który jest następnie podawany do metody hexData() i wysadza.

Wydaje się, że zdarza się to wielu osobom korzystającym z usług innych niż Amazon S3 lub korzystającym z usługi Amazon AWS S3 za pośrednictwem internetowego serwera proxy.

nie wiem o poprawki innych niż chwytając źródło klienta w Amazon, zmieniając wartość Headers.ETAG do "Etag" i budowaniu JAR siebie.

+1

Jeśli nie znasz odpowiedzi, proszę wpisz jako komentarz i nie odpowiadaj – DevelopmentIsMyPassion

+5

Dostarczyłem odpowiedź, po prostu nie jest prosty. Wymaga on przebudowania JARu klienta S3. Mam nadzieję, że tam jest lepsza odpowiedź. – jds

+1

to najgorsza odpowiedź, jaką kiedykolwiek czytałem na temat SO. Jeśli zdecydujesz się nie usuwać tej odpowiedzi, możesz poprawić ją, dodając linki do źródła, numery wierszy kodu, które powinny zostać zmienione, oraz przykłady, jak powinny wyglądać zmiany. –

0

Zmień protokół na HTTPS.

$ clientCfg.setProtocol (Protocol.HTTPS);

+0

Należy pamiętać, że pytanie pochodzi z roku 2012, w którym korzystanie z połączenia HTTP ** S ** nie było szeroko stosowane, jak ma to miejsce obecnie. – KarelG

1

tutaj jest inne podejście,

ClientConfiguration config = new ClientConfiguration(); 
config.setProtocol(Protocol.HTTPS); 
config.setProxyHost("YOUR_PROXY_IP"); 
config.setProxyPort(YOUR_PROXY_PORT); 

BasicAWSCredentials creds = new BasicAWSCredentials("YOUR_KEY", "YOUR_SECRET"); 
s3Client = AmazonS3ClientBuilder.standard() 
       .withClientConfiguration(config) 
       .withRegion(Regions.US_EAST_2) 
       .withCredentials(new AWSStaticCredentialsProvider(creds))     
       .build();