Свойства не работают в Java-приложении на основе весенней загрузки

0

У меня есть java-приложение с загрузкой весны. Я использую java.util.properties для чтения свойств из файла application.properties, присутствующего в src/main/resources (путь по умолчанию). Я только что определил геттеры и сеттеры, чтобы прочитать реквизит. Ниже приведен код:

public class PropertyReader {

    String host;

    public String getHost() {

        Properties properties = new Properties();
        try {
            File file = ResourceUtils.getFile("classpath:application.properties");
            InputStream in = new FileInputStream(file);
            properties.load(in);
        } catch (IOException e) {

        }
        return host = properties.getProperty("spring.mysql.host");
    }

    public void setHost(String host) {
        this.host = host;
    }

}

теперь, в другом классе, просто создавая объект этого класса и пытаясь вызвать метод getHost() для получения IP-адреса хоста.

PropertyReader pr = new PropertyReader();
String host = pr.getHost();
PoolProperties p = new PoolProperties();
p.setUrl("jdbc:mysql://" + host + "/ci");

следующее исключение:

Caused by: java.net.UnknownHostException: null
        at java.net.InetAddress.getAllByName0(InetAddress.java:1280) ~[na:1.8.0_151]
        at java.net.InetAddress.getAllByName(InetAddress.java:1192) ~[na:1.8.0_151]
        at java.net.InetAddress.getAllByName(InetAddress.java:1126) ~[na:1.8.0_151]
        at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:188) ~[mysql-connector-java-5.1.45.jar!/:5.1.45]
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:300) ~[mysql-connector-java-5.1.45.jar!/:5.1.45]
        ... 44 common frames omitted

без использования класса свойств, если я просто жестко кодирую IP-адрес, он отлично работает. не знаю, в чем проблема в коде, поэтому читатель свойств не работает.

после содержимого application.properties:

spring.mysql.host=35.154.83.162

Обновить ::

вот обновленный код:

@Component
@Configuration
public class UnitDBHelper {
@Autowired
    private Environment env;

public UnitDBHelper() {

        String host = env.getProperty("spring.mysql.host");     
        PoolProperties p = new PoolProperties();
        InputStream input = null;
        p.setUrl("jdbc:mysql://" + host + "/ci");

}
}

получение исключения NPE:

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2018-05-30 15:42:29.532 ERROR 9870 --- [           main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'unitDBHelper' defined in URL [jar:file:/tmp/unitdbamqpservice-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/infy/ci/unitdbamqpservice/UnitDBHelper.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.infy.ci.unitdbamqpservice.UnitDBHelper$$EnhancerBySpringCGLIB$$24a2dca6]: Constructor threw exception; nested exception is java.lang.NullPointerException

Caused by: java.lang.NullPointerException: null
        at com.infy.ci.unitdbamqpservice.UnitDBHelper.<init>(UnitDBHelper.java:39) ~[classes!/:0.0.1-SNAPSHOT]
        at com.infy.ci.unitdbamqpservice.UnitDBHelper$$EnhancerBySpringCGLIB$$24a2dca6.<init>(<generated>) ~[classes!/:0.0.1-SNAPSHOT]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_151]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_151]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_151]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_151]
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142) ~[spring-beans-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        ... 27 common frames omitted
  • 1
    Почему вы не используете аннотацию @Value Spring?
Теги:

1 ответ

1
Лучший ответ

При загрузке весны вам не нужно читать свойства вручную (особенно application.properties).
application.properties(.yml |.yaml) по умолчанию загружается в класс весны Environemnt.

@Component
public class PropertyReader {

    @Autowired
    private Environment env;

    public String getHost() {
        return env.getProperty("spring.mysql.host");
    }
}

Чтобы использовать его, просто введите autorire PropertyReader и вызовите getHost().
Даже вам не нужно писать этот класс, вы также можете напрямую использовать класс Environment.

EDIT (после обновления вопроса)

Решение 1 (Использование среды)

Переместите код конструктора в метод init, в этом пункте env не инициализируется.

public class UnitDBHelper implements InitializingBean {

    // your autowires

    @Override
    public void afterPropertiesSet() throws Exception {
        // your constructor code,
        // this will be called after injecting all beans
        // use 'env' here 
    }
}

Решение 2 (Использование @Value)

@Component
public class UnitDBHelper {

    @Value("${spring.mysql.host}")
    private String host;

    // you can still not use host in constructor
    // as it will be uninitialized 

    //  rest of code
}
  • 0
    Благодарю. обновил вопрос с последними изменениями кода. но сейчас получаю NPE.
  • 0
    Вы даже можете использовать аннотацию @Value
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню