Search code examples
spring-bootspring-dataslf4jaerospike

java.lang.NullPointerException at java.base/sun.nio.fs.UnixPath.normalizeAndCheck(UnixPath.java:75) in SpringApplication


I've spring-data-aerospike project at github in branch npe.

The application.properties is

aerospike.host=localhost
aerospike.port=3000
aerospike.namespace=test
aerospike.timeout=125
os.name=Linux
line.separator=\n

The spring ApplicationContext is

mport com.aerospike.demo.simplespringbootaerospikedemo.repositories.AerospikeUserRepository;
import com.aerospike.client.Host;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.aerospike.config.AbstractAerospikeDataConfiguration;
import org.springframework.data.aerospike.repository.config.EnableAerospikeRepositories;
import java.util.Collection;
import java.util.Collections;

@Configuration
@EnableConfigurationProperties(AerospikeConfigurationProperties.class)
@EnableAerospikeRepositories(basePackageClasses = AerospikeUserRepository.class)
public class AerospikeConfiguration extends AbstractAerospikeDataConfiguration {
  @Autowired
  private AerospikeConfigurationProperties aerospikeConfigurationProperties;
  @Override
  protected Collection<Host> getHosts() {
    return Collections.singleton(new Host(aerospikeConfigurationProperties.getHost(), aerospikeConfigurationProperties.getPort()));
  }
  @Override
  protected String nameSpace() {
    return aerospikeConfigurationProperties.getNamespace();
  }
}

The main application is -

import com.aerospike.demo.simplespringbootaerospikedemo.configuration.AerospikeConfiguration;
import com.aerospike.demo.simplespringbootaerospikedemo.objects.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.data.aerospike.core.AerospikeTemplate;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.stream.Stream;
import org.joda.time.DateTime;

public class TestSpringConfig {
  public static void main(String[] args) throws IOException {
    System.out.println(ClassLoader.getSystemResourceAsStream("application.properties").available());

    Properties props = new Properties();
    InputStream resourceAsStream =  ClassLoader.getSystemResourceAsStream("application.properties");
    if (resourceAsStream != null) {
      props.load(resourceAsStream);
    }
    if(props != null) {
      System.setProperties(props);
    }
    try {
      ApplicationContext ctx = new AnnotationConfigApplicationContext(AerospikeConfiguration.class);
      AerospikeTemplate template = ctx.getBean(AerospikeTemplate.class);
      template.save(new User(123, "","", 12, DateTime.now().plusSeconds(60).getMillis()));
    } catch (Exception e) {
      StackTraceElement[] st = e.getStackTrace();
      Stream.of(st).forEach(System.out::println);
    } catch (ExceptionInInitializerError e) {
      System.out.println(e.getCause());
      e.getCause().printStackTrace();
    }
  }
}

when I run the main application I get below error -

java.lang.NullPointerException at java.base/sun.nio.fs.UnixPath.normalizeAndCheck(UnixPath.java:75) at java.base/sun.nio.fs.UnixPath.(UnixPath.java:69) at java.base/sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:279) at java.base/java.io.FilePermission.(FilePermission.java:207) at java.base/sun.security.provider.PolicyFile.getKnownPermission(PolicyFile.java:886) at java.base/sun.security.provider.PolicyFile.getInstance(PolicyFile.java:836) at java.base/sun.security.provider.PolicyFile.addGrantEntry(PolicyFile.java:735) at java.base/sun.security.provider.PolicyFile.initDefaultPolicy(PolicyFile.java:491) at java.base/sun.security.provider.PolicyFile$2.run(PolicyFile.java:338) at java.base/sun.security.provider.PolicyFile$2.run(PolicyFile.java:335) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/sun.security.provider.PolicyFile.initPolicyFile(PolicyFile.java:335) at java.base/sun.security.provider.PolicyFile.init(PolicyFile.java:328) at java.base/sun.security.provider.PolicyFile.(PolicyFile.java:281) at java.base/java.security.Policy.loadPolicyProvider(Policy.java:207) at java.base/java.security.Policy.getPolicyNoCheck(Policy.java:178) at java.base/java.security.ProtectionDomain.implies(ProtectionDomain.java:321) at java.base/java.security.ProtectionDomain.impliesWithAltFilePerm(ProtectionDomain.java:353) at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:450) at java.base/java.security.AccessController.checkPermission(AccessController.java:897) at ch.qos.logback.core.util.Loader$1.run(Loader.java:48) at ch.qos.logback.core.util.Loader$1.run(Loader.java:45) at java.base/java.security.AccessController.doPrivileged(Native Method) at ch.qos.logback.core.util.Loader.(Loader.java:45) at ch.qos.logback.classic.util.ContextInitializer.findURLOfDefaultConfigurationFile(ContextInitializer.java:109) at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:138) at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84) at org.slf4j.impl.StaticLoggerBinder.(StaticLoggerBinder.java:55) at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150) at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124) at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:417) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362) at org.apache.commons.logging.LogAdapter$Slf4jAdapter.createLocationAwareLog(LogAdapter.java:130) at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:91) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:59) at org.springframework.context.support.AbstractApplicationContext.(AbstractApplicationContext.java:178) at org.springframework.context.support.GenericApplicationContext.(GenericApplicationContext.java:112) at org.springframework.context.annotation.AnnotationConfigApplicationContext.(AnnotationConfigApplicationContext.java:67) at org.springframework.context.annotation.AnnotationConfigApplicationContext.(AnnotationConfigApplicationContext.java:91) at com.aerospike.demo.simplespringbootaerospikedemo.TestSpringConfig.main(TestSpringConfig.java:27)

Any idea how to fix this error?


Solution

  • The workaround that you tried to implement in order to "Autowire" AerospikeTemplate bean doesn't work and results in a NPE. There are a few ways to "Autowire" a bean (in this case an AerospikeTemplate bean) in the static main() method, here is a StackOverFlow question that talks about this scenario: How to use autowired (@Autowired) references from main(String[] args) method?

    But the main question is what are you trying to achieve? the conventional way of using Spring Data Aerospike Repository/Template is to Autowire the repository/template in a service (also a bean) and then call the service methods from something like a controller/test/different service etc... Most Spring applications doesn't include logic inside the static main() method - it can be done but it doesn't make much sense.