Не получается целочисленное значение из файла свойств - PullRequest
0 голосов
/ 17 июня 2019

Я хочу прочитать целочисленное значение из ключа, который я определил в файле application.properties.Вот мой файл свойств.

spring.rabbitmq.port = 31111

А вот код:

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

    }
    return (Integer) properties.get("spring.rabbitmq.port");

}

@Autowired
public UnitAmqpRestController(RabbitTemplate rabbitTemplate) throws IOException, TimeoutException {
    this.rabbitTemplate = rabbitTemplate;
    rabbitTemplate.setReplyTimeout(15_000L);
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost(getHostProperty());
    factory.setPort((Integer) getPortProperty());
    connection = factory.newConnection();
    channel = connection.createChannel();
}

Получение следующей ошибки:

org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем 'unitAmqpRestController', определенным в URL [jar: file: /tmp/unitamqpservice-0.0.1-SNAPSHOT.jar! /BOOT-INF / classes! /Com/abc/ci/unitamqpservice/UnitAmqpRestController.class]: не удалось создать экземпляр объекта с помощью конструктора;вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [com.abc.ci.unitamqpservice.UnitAmqpRestController $$ EnhancerBySpringCGLIB $$ e7ff3f42]: исключение конструктора;вложенным исключением является java.lang.NullPointerException в org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:279) ~ [spring-beans-4.3.14.RELEASE.jar! /: 4.3.14.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1193) ~ [spring-beans-4.3.14.RELEASE.jar! /: 4.3.14.Rerebebe.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1095) ~ [spring-beans-4.3.14.RELEASE.jar! /: 4.3.14.doCreateBean (AbstractAutowireCapableBeanFactory.java:513) ~ [spring-beans-4.3.14.RELEASE.jar! /: 4.3.14.RELEASE] в org.springframework.beans.factory.support.) ~ [spring-beans-4.3.14.RELEASE.jar! /: 4.3.14.RELEASE] на org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:306) ~ [spring-beans-4.3.14.RELEASE.jar! /: 4.3.14.RELEASE] в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230) ~ [spring-beans-4.3.14.RELEASE.jar! /: 4.3.14.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFacteFeFeoryBeganFacte.Ge.java: 302) ~ [spring-beans-4.3.14.RELEASE.jar! /: 4.3.14.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:197) ~ [spring-beans-4.3.14.RELEASE.jar! /: 4.3.14.RELEASE] в org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:761) ~ [spring-beans-4.3.14.RELEASE.jar! /: 4.3.14.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:867) ~ [spring-context-4.3.14.RELEASE.jar! /: 4.3.14.RELEASE] в org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:543) ~ [spring-context-4.3.14.RELEASE.jar! /: 4.3.14.RELEASE] в org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh (EmbeddedWebApplicationContext.java:122) ~ [spring-boot-1.5.10.RELEASE.jar! /: 1.5.10.RELEASE] в org.springframework.boot.SpringApplication.refresh (SpringApplication.java:693) [spring-boot-1.5.10.RELEASE.jar! /: 1.5.10.RELEASE] в org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:360) [spring-boot-1.5.10.RELEASE.jar! /: 1.5.10.RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication.java:303) [spring-boot-1.5.10.RELEASE.jar! /: 1.5.10.RELEASE] at org.springframework.boot.SpringApplication.run (SpringApplication.java:1118) [spring-boot-1.5.10.RELEASE.jar! /: 1.5.10.RELEASE]в org.springframework.boot.SpringApplication.run (SpringApplication.java:1107) [Весна-загрузки 1.5.10.RELEASE.jar /: 1.5.10.RELEASE] в com.abc.ci.unitamqpservice.UnitamqpserviceApplication.main (UnitamqpserviceApplication.java:10) [Классы /: 0.0.1-SNAPSHOT] at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) ~ [na: 1.8.0_212] at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) ~ [На: 1.8.0_212] at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) ~ [На: 1.8.0_212] at java.lang.reflect.Method.invoke (Method.java:498) ~ [na: 1.8.0_212] в org.springframework.boot.loader.MainMethodRunner.run (MainMethodRunner.java:48) [Unitamqpservice-0.0.1-SNAPSHOT.jar: 0.0.1-СНАПШОТ] на org.springframework.boot.loader.Launcher.launch (Launcher.java:87) [Unitamqpservice-0.0.1-SNAPSHOT.jar: 0.0.1-СНАПШОТ] на org.springframework.boot.loader.Launcher.launch (Launcher.java:50) [Unitamqpservice-0.0.1-SNAPSHOT.jar: 0.0.1-СНАПШОТ] в org.springframework.boot.loader.JarLauncher.main (JarLauncher.java:51) [unitamqpservice-0.0.1-SNAPSHOT.jar: 0.0.1-SNAPSHOT] Причина: org.springframework.beans.BeanInstantiationException: не удалось иллюстрировать примерами [Com..ci.unitamqpservice.UnitAmqpRestController $$ EnhancerBySpringCGLIB $$ e7ff3f42]: Конструктор бросил исключение; вложенное исключение java.lang.NullPointerException в org.springframework.beans.BeanUtils.instantiateClass (BeanUtils.java:154) ~ [! весна-бобы-4.3.14.RELEASE.jar /: 4.3.14.RELEASE] в org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:122) ~ [! весна-бобы-4.3.14.RELEASE.jar /: 4.3.14.RELEASE] в org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor (ConstructorResolver.java:271) ~ [! весна-бобы-4.3.14.RELEASE.jar /: 4.3.14.RELEASE] ... 26 общих кадров опущено. Причины: в com.abc.ci.unitamqpservice.UnitAmqpRestController. (UnitAmqpRestController.java:75) ~ [Классы /: 0.0.1-SNAPSHOT] в com.abc.ci.unitamqpservice.UnitAmqpRestController $$ EnhancerBySpringCGLIB $$ e7ff3f42. () ~ [Классы /: 0.0.1-SNAPSHOT] at sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) ~ [На: 1.8.0_212] at sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) ~ [На: 1.8.0_212] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) ~ [На: 1.8.0_212] в java.lang.reflect.Constructor.newInstance (Constructor.java:423) ~ [На: 1.8.0_212] в org.springframework.beans.BeanUtils.instantiateClass (BeanUtils.java:142) ~ [! весна-бобы-4.3.14.RELEASE.jar /: 4.3.14.RELEASE] ... 28 общих кадров пропущено

Я не могу понять, почему он не работает с целым числом. если у меня есть строковое значение, оно отлично работает. подскажите пожалуйста что не так в коде

Проблемная строка кода:

factory.setPort((Integer) getPortProperty());

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Имея spring.rabbitmq.port=31111 в application.properties или yml, прочитайте его, используя аннотацию @Value, которая считывает свойство и анализирует правильный тип:

@Value("${spring.rabbitmq.port=31111}")
private int port;

Сам класс должен распознаваться как bean-компонент, использующий либо @Configuration, либо любой вариант @Component, например @Service.

Если вы хотите загрузить свойство, используя метод, как вы делаете, рассмотрите возможность использования специального метода для целых чисел:

private int getIntegerProperty(final String key, final int defaultValue) {
    final Object object = properties.get("spring.rabbitmq.port")
    if (object == null || "".equals(object.toString())) {
        return defaultValue;
    } else {
        return Integer.parseInt(object );
    }
}
1 голос
/ 17 июня 2019

Ваш код выбрасывает NullPointerException, и у вас есть пустой блок catch.Как минимум, вы должны добавить туда вход в систему, чтобы увидеть, что происходит.

Кроме того, вы используете Spring и вам редко требуется анализировать application.properties вручную;он автоматически загружается в среду приложения.

Таким образом, вы можете использовать @Value вместо привязки его к локальной переменной (то же самое для свойства хоста):

@Value("${spring.rabbitmq.port}")
private int mqPort;

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

@Autowired
public UnitAmqpRestController(RabbitTemplate rabbitTemplate) throws IOException, TimeoutException {
    this.rabbitTemplate = rabbitTemplate;
    rabbitTemplate.setReplyTimeout(15_000L);
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost(mqHost);
    factory.setPort(mqPort);
    connection = factory.newConnection();
    channel = connection.createChannel();
}

Кроме того, вам следуетрассмотрите возможность использования Spring Boot Rabbit MQ starter модуля для управления соединениями и свойствами Rabbit MQ вместо того, чтобы управлять им самостоятельно.

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