Multi-модуль Spring-Boot не может прочитать файл свойств из другого модуля - PullRequest
0 голосов
/ 06 октября 2018

Я искал Высокие и низкие и до сих пор не могу найти простой ответ на эту очень раздражающую проблему,

Я следовал этому великому руководству: JWT с мультисервисным приложением Всепрекрасно работает, но в конце руководства нам предлагается создать config-сервис (модуль), что я и сделал.

Проблема в том, что я не могу переопределить конфигурацию по умолчанию для класса JwtConfig

Структура проекта выглядит следующим образом:

-config-service 

    | JwtConfig.java
     \
        | resources 
        \
         | jwtConfig.properties

 -other-service (add dependency in the pom file of the config-service)
     |
       someOtherclass.java (import the JwtConfig class & using @Bean to initialize )

Класс JwtConfig:

/*all the imports*/ 
@PropertySource(value = "classpath:jwtConfig.properties")
public class JwtConfig {

@Value("${security.jwt.uri:/auth/**}")
private String Uri;

@Value("${security.jwt.header:Authorization}")
private String header;

@Value("${security.jwt.prefix:Bearer }")
private String prefix;

@Value("${security.jwt.expiration:#{24*60*60}}")
private int expiration;

@Value("${security.jwt.secret:JwtSecretKey}")
private String secret;

 //getters

someOtherclass.java:

/*imports*/

@Configuration
@EnableWebSecurity
public class SecurityCredentialsConfig  extends WebSecurityConfigurerAdapter 
{ 

   private JwtConfig jwtConfig; 

   @Autowired
   public void setJwtConfig(JwtConfig jwtConfig) {
       this.jwtConfig = jwtConfig;
   }
   @Bean
   public JwtConfig jwtConfig() {
    return new JwtConfig();
   }
   /*other code*/

Проблема в том, что не имеет значения, какие параметры я добавляю в файл jwtConfig.properties,

Например:

   security.jwt.uri=test 

Он не будет отображаться в бине JwtConfig, когда другой сервис загружает его.

Загружаются только значения по умолчанию @ Value.

Может у кого-нибудь есть совет?как я могу это исправить?Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Я думаю, что вместо использования @PropertySources лучшим подходом и более подходящим будет использование @ComponentScan в вашем модуле, который содержит «основной метод».Так как вам нужен экземпляр класса JWTConfiguration, а не фактический файл .property , более рекомендуется выставить объект EJB и заставить его выполнить Springboot-сканирование из другого модуля, а не файл файла свойств (потому что этоделает файл jwtConfiguration.java в другом модуле довольно бесполезным.) Таким образом, вы можете попробовать что-то вроде этого

Скажем, у нас есть два модуля - Module1 и Module2 внутри основного модуля (который имеет только pom).Я предполагаю, что вы знаете, что модуль без кода просто упаковывает приложение как «pom» и описывает зависимые модули внутри

Ваш основной pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>XXX</groupId>
    <artifactId>XXXX</artifactId>
    <packaging>pom</packaging>
    <version>1.0</version>
    <name>ws-cms-engine</name>
    <url>http://maven.apache.org</url>
    <properties>
        <spring-boot.version>2.0.0.RELEASE</spring-boot.version>
        <spring-kafka.version>2.2.3.RELEASE</spring-kafka.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
............
............
    <modules>
      <module>Module1</module>
      <module>Module2</module>
    </modules>

Теперь давайте рассмотрим, что ваша JWTConfiguration находится в Module1 и использует файл свойств в объявленной папке ресурсов - application.properties

Пример файла JWTConfiguation.java

package common.module2.config
@Configuration
@PropertySources("classpath:application.properties")
public class JWTConfiguration{

  @Value("${config1}")
  private String someConfig;


}

Теперь, если у вашего Module2 есть главный класс, который должен использовать эту конфигурацию, то, вероятно, что-то вроде этого имело бы смысл

Нам нужно сделать так, чтобы контейнер SpringBoot читал из bean-компонента, объявленного в module1, а не читал фактическийфайл свойств

@ComponentScan(basepackages={"common.module2.config", "common.module1.this.config"})
@SpringBootApplication
public class Application(){
    public static void main(String args[]){
     SpringApplication.run(Application.class);
   }
}

Итак, здесь мы сообщаем, что bean-компоненты, объявленные в пакете module2, должны проверяться контейнером пружины при его запуске и инициализации

Теперь вы можете автоматически связывать bean-компонент в нужной службеи используйте его

@Service
public class SampleService{
   @Autowired
   JWTConfiguration config;

}

Это должно автоматически связать управляемый экземпляр JWTConfiguration для использования

0 голосов
/ 06 октября 2018

Посмотрев в сообщении Михаила Холодкова (Спасибо!),

Решение состоит в том, чтобы добавить следующую аннотацию к точке использования сервиса:

 @PropertySources({
    @PropertySource("classpath:jwtConfig.properties"),
    @PropertySource("classpath:app.properties")
})
public class OtherServiceApplication {
public static void main(String[] args) {
    SpringApplication.run(OtherServiceApplication.class, args);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...