programing

@ConfigurationProperties 접두사가 작동하지 않습니다.

abcjava 2023. 3. 2. 21:53
반응형

@ConfigurationProperties 접두사가 작동하지 않습니다.

.yml 파일

cassandra:
    keyspaceApp:junit
solr:
    keyspaceApp:xyz

@Component
@ConfigurationProperties(prefix="cassandra")
public class CassandraClientNew {
   @Value("${keyspaceApp:@null}") private String keyspaceApp;

메인 메서드 파일

@EnableAutoConfiguration
@ComponentScan
@PropertySource("application.yml")
public class CommonDataApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(CommonDataApplication.class)
                .web(false).headless(true).main(CommonDataApplication.class).run(args);
    }
}

테스트 케이스

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = CommonDataApplication.class)
@IntegrationTest
@EnableConfigurationProperties
public class CassandraClientTest {

    @Autowired
    CassandraClientNew cassandraClientNew;

    @Test
    public void test(){
        cassandraClientNew.getSession();
        System.out.println(" **** done ****");
    }
}

junit을 keyspaceApp으로 설정하는 대신 xyz를 설정합니다.

접두사="cassandra"가 작동하지 않는 것 같습니다.

Spring Boot Typesafe Configuration Properties 기능을 사용하려고 하는 것 같습니다.

따라서 올바르게 동작하려면 코드에 몇 가지 변경을 추가해야 합니다.

우선, 당신의CommonDataApplication학급은 가지고 있어야 한다.@EnableConfigurationProperties주석(예:

@EnableAutoConfiguration
@ComponentScan
@PropertySource("application.yml")
@EnableConfigurationProperties
public class CommonDataApplication {

    public static void main(String[] args) {
        // ...
    }
}

난 네가 필요 없다고 생각해.@PropertySource("application.yml")로서의 주석.application.yml(또한application.properties그리고.application.xml)는 Spring Boot에서 사용되는 기본 설정 파일입니다.

당신의.CassandraClientNewclass는 필요 없습니다.@Value주석 프리픽스keyspaceApp소유물.그리고 당신의keyspaceApp 세터 방식이어야 합니다.

@Component
@ConfigurationProperties(prefix="cassandra")
public class CassandraClientNew {

   private String keyspaceApp;

   public void setKeyspaceApp(final String keyspaceApp) {
       this.keyspaceApp = keyspaceApp;
   }
}

BTW, 를 사용하고 있는 경우List또는Set수집을 초기화합니다(예:List<String> values = new ArrayList<>();필요한 것은 getter뿐입니다.컬렉션이 초기화되지 않은 경우 setter 메서드도 제공해야 합니다(그렇지 않으면 예외가 느려집니다).

그게 도움이 됐으면 좋겠어요.

일반답변수

1. 속성 파일 (application.properties 또는 application.yml)

# In application.yaml
a:
  b:
    c: some_string

2. 당신의 클래스를 선언합니다.

@Component
@ConfigurationProperties(prefix = "a", ignoreUnknownFiels = false)
public class MyClassA {

  public MyClassB theB;   // This name actually does not mean anything
                          // It can be anything      
  public void setTheB(MyClassB theB) {
    this.theB = theB;
  }

  public static MyClassB {

    public String theC;

    public void setTheC(String theC) {
      this.theC = theC;
    }

  }

}

3. 공공세팅업자를 선언하라!그리고 이것은 매우 중요합니다!

위의 클래스에서 이러한 공개 메서드를 선언해야 합니다.public」수식자가 있는 것을 확인합니다.

// In MyClassA
public void setTheB(MyClassB theB) {
  this.theB = theB;
}

// In MyClassB
public void setTheC(String theC) {
  this.theC = theC;
}

바로 그겁니다.

최종 노트

  • 당신 수업의 속성 이름은 스프링에게 아무 의미도 없어요.퍼블릭 세터만 사용합니다.나는 그들이 여기서 공공장소를 선언하지 않는다고 선언했다.속성에는 액세스 수식자가 있을 수 있습니다.
  • "ignore" 속성에 유의하십시오.[ Unknown Fields ](알 수 없는 필드).기본값은 "true" 입니다."false"일 경우 파일 "application.yml"의 속성이 클래스 속성에 바인딩되지 않은 경우 예외가 발생합니다.디버깅 시 많은 도움이 됩니다.

"xyz"가 어디서 왔는지 알 수 없습니다(어플리케이션 전체를 보여주지 않을 수도 있습니다.yml?당신은 보통 그 일에 얽매이지 않는다.@Value@ConfigurationProperties단, (프리픽스가 무엇인지 알 수 있는 방법은 없습니다).실제로 그랬습니까?@EnableCongigurationProperties아무데나?사용하고 있습니까?SpringApplication응용 프로그램 컨텍스트를 만들 수 있습니까?

Lombok의 퍼블릭세터 @Setter를 추가하기만 하면 됩니다.

OP와 비슷하지만 다른 문제가 있어서 어디에서도 답을 찾을 수 없었기 때문에 투고하겠습니다.예를 들어 Lombok을 사용하여 설정 파일에 getters & setters 및 기타 필드를 자동으로 생성하려고 합니다.

다음은 예를 제시하겠습니다.

@Configuration
@ConfigurationProperties(prefix = "address")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AddressConfig {
  private Endpoint endpoint;

  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  @Builder
  public static class Endpoint {
    private String url;
  }

}

을 사용하는 @Getter&@Setter 주석)@Data 보살피다@Getter&@Setter 이 도 꼭 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.

@Accessors(fluent = false)

이유: 봄에는 설정을 실제로 입력하기 위한 setter 메서드가 필요합니다.단, 위의 예에서는 봄에 내부적으로 URL을 설정하는 방법을 보여 줍니다.

addressConfig.getEndpoint().setUrl("...");

프리픽스에는 getters 프리픽스가 을 알 수 .get에는 "setters" 접두사 "setters" 가 .set.

「 」가 @Accessors(fluent = false), , setters, get, get, get, setters, get, setters, get, setters, get, setters, get, setters, get, setters, get, setters, getters, getters, getters, , getters, getters, getters, get, , , get , , setters, s이로 인해 설정 pojo를 올바르게 입력하기 위한 스프링 기능이 상실됩니다.

응용 프로그램을 실행할 때 스프링이 이를 알려주지 않습니다.응용 프로그램에서 이러한 구성 변수를 사용하려고 시도할 때만 null 포인터 예외가 표시됩니다.난 이제서야 깨달았어@Accessors(fluent = false)구글 수 를 몇 동안 한 후 에 대해 경고합니다.사이드 노트: 인텔리지는 다음과 같이 경고합니다.false는 의 입니다.@Accessors. -_-

어쨌든 여기에 주석이 있는 구성 클래스가 있습니다(예, 내부 클래스가 아닌 클래스 맨 위에 한 번만 추가하면 됩니다).

@Configuration
@ConfigurationProperties(prefix = "address")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AddressConfig {
  private Endpoint endpoint;

  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  @Accessors(fluent = false)
  @Builder
  public static class Endpoint {
    private String url;
  }

}

이것이 이 케이스에 대한 풀 솔루션입니다.

클래스는 다음 속성을 받습니다.

// Setter are CRUCIAL for PropertySource + ConfigurationProperties works properly
@PropertySource(value = "classpath:application-dev.yml", ignoreResourceNotFound = true)
@ConfigurationProperties(prefix = "spring.data.mongodb")
@Setter
@Profile("dev")
@Configuration
@EnableReactiveMongoRepositories(
     basePackages = {
          "com.webflux.mongo2.project.repo",
          "com.webflux.mongo2.task.repo"})
public class MyClassGettingTheProperties {
  private String database;
  private String host;
  private String port;
  private String username;
  private String password;
  private String authenticationDatabase;
}

내 속성 파일 - application-dev.yml:

spring:
  data:
    mongodb:
      database: ${MONGO_INITDB_DATABASE}
      host: ${HOST}
      port: ${PORT}
      username: ${MONGO_INITDB_ROOT_USERNAME}
      password: ${MONGO_INITDB_ROOT_PASSWORD}
      authentication-database: ${AUTH_MAN}

속성의 "원점"도커 컴포지트:

version: "3.4"

x-common-variables:
  &env-vars
  PORT_API: 1313
  MONGO_INITDB_DATABASE: zzzzz
  HOST: yyyyy
  PORT: 27017
  MONGO_INITDB_ROOT_USERNAME: xxxxx
  MONGO_INITDB_ROOT_PASSWORD: xxxxxxx
  AUTH_MAN: kkkkk

volumes:
  api_vol:

networks:
  mongo-cluster:

services:
  api-db:
    container_name: api-db
    image: mongo:4.4.4
    restart: always
    ports:
      - "27017:27017"
    networks:
      - mongo-cluster
    volumes:
      - api_vol:/data/db
    environment:
      *env-vars

언급URL : https://stackoverflow.com/questions/27416327/configurationproperties-prefix-not-working

반응형