2012-05-09 6 views
6

У меня есть этот простой фрагмент кода, который пытается загрузить файл на Amazon S3 через прокси. Это код:Клиент Amazon S3 подключается через прокси - putObject получает 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)); 

Однако это ошибка, я получил от запуска программы:

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 

Я использую последний AWS 1.3.8 SDK от амазонки. Прокси-сервер настроен на другом компьютере рядом со мной, и это просто простой прокси Javascript (http://www.catonmat.net/http-proxy-in-nodejs/)

Я не могу понять, почему , Кто-нибудь может мне помочь, пожалуйста?

+0

После дальнейших исследований, я узнал, что это был hexData равна нулю в функции: общественный статический байт [] fromHex (String hexData) от BinaryUtils.java линии 69. Что это за другие способы, по которым я могу получить больше отладочной информации? – Eugene

+0

UPDATE: У меня была такая же проблема с AWS SDK 1.6.7, похоже, все работает сейчас после обновления до 1.9.35 – sscarduzio

ответ

3

Я столкнулся с этим вопросом. Я прошел через все в отладчике и обнаружил, что причиной проблемы является клиентский код Amazon S3, ожидающий тега заголовка "ETag", но ответ содержит "Etag" с нижним регистром "t".

заголовки помещаются в Map<String,String>, так что, когда клиентский код Amazon S3 вызывает get("ETag"), он получает обратно null, который затем подается в метод hexData() и взрывается.

Это, похоже, случается с рядом людей, использующих услуги Amazon S3 или доступа к службе AWS S3 Amazon через веб-прокси.

Я не знаю об исправлении, кроме захвата источника клиента Amazon, меняя значение Headers.ETAG на "Etag" и строя JAR самостоятельно.

+1

Если вы не знаете ответ, тогда поставьте комментарий и не ответите – DevelopmentIsMyPassion

+5

Я дал ответ, просто не простой. Это требует восстановления JAR клиента S3. Надеюсь, там где-то есть лучший ответ. – jds

+1

Это худший ответ, который я когда-либо читал. Если вы решили не удалять этот ответ, вы можете улучшить его со ссылками на источник, номера строк для строк кода, которые необходимо изменить, и примеры того, как должны выглядеть изменения. –

0

Измените протокол на HTTPS.

$ clientCfg.setProtocol (Protocol.HTTPS);

+0

Помните, что вопрос с 2012 года, когда использование соединения HTTP ** S ** широко не использовалось, как сейчас. – KarelG

1

здесь другой подход,

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(); 
Смежные вопросы