Исключение нулевого указателя Amazon S3 Bucket - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь использовать AWS S3 SDK. Моя структура проекта разделена на модули для лучшей модульности.

У меня есть 4 файла

+-- S3Application.java
+-- S3InterfaceImpl.java
+-- S3Config.java
+-- S3CreateBucketClient.java\

Вот код для каждого из вышеупомянутых файлов:

public class S3Application{

private static S3InterfaceImpl S3InterfaceImpl;

public static void main(String[] args) throws IOException {

        try {
            System.out.println("Reached");
            S3InterfaceImpl.createBucket("hello123");
        } catch (Exception e) {
            System.out.println("Exception");
        }

    }
} 

Iиметь S3InterfaceImpl с createBucket методом, который затем вызывает s3CreateBucketClient.createBucket

@Slf4j
@Component
@RequiredArgsConstructor
public class S3InterfaceImpl implements S3Interface {

    private Logger log;

    private S3CreateBucketClient s3CreateBucketClient;


    @Override
    public void createBucket(String bucketName) {
        // TODO Auto-generated method stub
        try {
            System.out.println("Reached");
            s3CreateBucketClient.createBucket(bucketName);
        } catch (Exception e) {
            log.error("Exception while creating bucket {}", bucketName, e);
            //throw new TechnicalException(ErrorCode.S3_PROCESSING_FAILED, e);
        }

    }
} 

Здесь у меня есть S3Config для настройки моих ключей доступа

public class S3Config {

    private static final AWSCredentials credentials;
    static {
        //put your accesskey and secretkey here
        credentials = new BasicAWSCredentials(
                "<access-key>",
                "<secret-key>");
    };
    public AmazonS3 createS3Client() {

            AmazonS3 s3Client = AmazonS3ClientBuilder
                    .standard()
                    .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://192.168.44.225:9000","us-east-1"))
                    .withCredentials(new AWSStaticCredentialsProvider(credentials))
                    .withPathStyleAccessEnabled(false)
                    .build();

        return s3Client;
    }

} 

Здесь у меня S3CreateBucketClientс методами AWS SDK.

@Component
@RequiredArgsConstructor
@Slf4j
public class S3CreateBucketClient {

    private Logger log;

    private S3Config S3Config = new S3Config();
    private final AmazonS3 s3Client = S3Config.createS3Client();

    public void createBucket(String bucketName) {
        boolean bucketExist = s3Client.doesBucketExistV2(bucketName);
        log.info("Bucket with name {} exist {}", bucketName, bucketExist);
        if(!bucketExist) {
            Bucket bucket = s3Client.createBucket(bucketName);
            if(bucket == null) {
                throw new RuntimeException("Failed to create bucket with name " + bucketName);
            }
        }
    }
} 

Я получаю Exception in thread "main" java.lang.NullPointerException при S3InterfaceImpl.createBucket("hello123"); в S3Application

1 Ответ

0 голосов
/ 30 сентября 2019

Похоже, это не имеет ничего общего с AWS или S3 и является проблемой с вашим кодом ООП. Вы должны присвоить экземпляр объекта переменной, объявленной с типом класса, прежде чем пытаться получить доступ к члену этой переменной / объекта.

В S3Application вы никогда не создаете экземпляр свойства S3InterfaceImpl в своем классес экземпляром S3InterfaceImpl перед вызовом функции создания. Таким образом, если вы отлаживаете строку кода, которая дает сбой и проверяет переменную S3InterfaceImpl, вы должны увидеть, что она имеет значение NULL. Когда вы пытаетесь получить доступ к любому члену переменной со значением NULL, вы получаете исключение NullPointerException.

Где-то вам требуется S3InterfaceImpl = new S3InterfaceImpl (), или вам нужно использовать DI, чтобы ввести один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...