2012-05-09 10 views
6

Tengo este simple trozo de código que intenta cargar un archivo a Amazon S3 a través de un proxy. Este es el código:cliente de Amazon S3 se conectan a través de proxy - putObject conseguir 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)); 

Sin embargo, este es el error que recibí de la ejecución del programa:

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 

estoy usando las últimas AWS SDK 1.3.8 de Amazon. El proxy está configurado en otra PC al lado mío y es solo un simple proxy de Javascript (http://www.catonmat.net/http-proxy-in-nodejs/)

No puedo entender por qué . Alguien puede ayudarme, por favor?

+0

Después de investigaciones adicionales, descubrí que era el hexData es nulo en la función: byte public static fromHex [] (Cadena hexData) de la línea BinaryUtils.java 69. ¿Es de alguna otra manera en que puedo obtener más información de depuración? – Eugene

+0

ACTUALIZACIÓN: He tenido el mismo problema con AWS SDK 1.6.7, parece estar todos trabajando ahora, después de una actualización a 1.9.35 – sscarduzio

Respuesta

3

me encontré con este problema también. Di un paso a través de todo en un depurador y se encontró que la causa del problema es el código de cliente de Amazon S3 esperando una llamada etiqueta de cabecera "ETag", pero la respuesta contiene "Etag", con una minúscula "t".

Las cabeceras se ponen en un Map<String,String>, por lo que cuando el código de cliente de Amazon S3 llama get("ETag"), se pone de vuelta null, que se alimenta entonces en el método hexData() y explota.

Esto parece suceder a un número de personas que utilizan los servicios no Amazon S3 o el acceso de servicios de AWS S3 de Amazon a través de un proxy web.

No sé de una solución que no sea acaparar la fuente del cliente de Amazon, cambiar el valor de Headers.ETAG a "Etag" y construir el JAR usted mismo.

+1

Si usted no sabe responder, por favor, poner como comentario y no responde – DevelopmentIsMyPassion

+5

hice dar una respuesta, simplemente no es simple. Requiere la reconstrucción del JAR del cliente S3. Espero que haya una mejor respuesta en algún lugar. – jds

+1

esta es la peor respuesta que he leído en SO. Si está decidido a no eliminar esta respuesta, podría mejorarla con enlaces a fuentes, números de líneas para las líneas de código que deberían modificarse y ejemplos de cómo deberían verse los cambios. –

0

Cambia el protocolo a HTTPS.

$ clientCfg.setProtocol (Protocol.HTTPS);

+0

Tenga en cuenta que la fecha de la pregunta es de 2012, donde el uso de la conexión HTTP ** S ** no se utilizó ampliamente como lo es hoy en día. – KarelG

1

aquí es otro enfoque,

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(); 
Cuestiones relacionadas