source

Spring Boot application.properties 값이 채워지지 않았습니다.

gigabyte 2022. 10. 29. 10:00
반응형

Spring Boot application.properties 값이 채워지지 않았습니다.

매우 심플한 Spring Boot 앱이 있어 외부 구성을 사용하려고 합니다.스프링 부츠 설명서에 나와 있는 정보를 따르려고 했지만 장애물에 부딪혔어요.

아래의 앱을 실행하면 application.properties 파일의 외부 설정이 빈 내의 변수에 입력되지 않습니다.제가 멍청한 짓을 하고 있는 게 분명해요, 제안해 주셔서 감사합니다.

MyBean.java(/src/main/java/foo/bar/에 있음)

package foo.bar;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

    @Value("${some.prop}")
    private String prop;

    public MyBean() {
        System.out.println("================== " + prop + "================== ");
    }
}

Application.java(/src/main/java/foo/에 있음)

package foo;

import foo.bar.MyBean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    @Autowired
    private MyBean myBean;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

application.properties(/src/main/main/mapperties/에 있음)

some.prop=aabbcc

Spring Boot 앱 실행 시 로그 출력:

grb-macbook-pro:properties-test-app grahamrb$ java -jar ./build/libs/properties-test-app-0.1.0.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.1.5.RELEASE)

2014-09-10 21:28:42.149  INFO 16554 --- [           main] foo.Application                          : Starting Application on grb-macbook-pro.local with PID 16554 (/Users/grahamrb/Dropbox/dev-projects/spring-apps/properties-test-app/build/libs/properties-test-app-0.1.0.jar started by grahamrb in /Users/grahamrb/Dropbox/dev-projects/spring-apps/properties-test-app)
2014-09-10 21:28:42.196  INFO 16554 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@67e38ec8: startup date [Wed Sep 10 21:28:42 EST 2014]; root of context hierarchy
2014-09-10 21:28:42.828  INFO 16554 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
2014-09-10 21:28:43.592  INFO 16554 --- [           main] .t.TomcatEmbeddedServletContainerFactory : Server initialized with port: 8080
2014-09-10 21:28:43.784  INFO 16554 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2014-09-10 21:28:43.785  INFO 16554 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.54
2014-09-10 21:28:43.889  INFO 16554 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2014-09-10 21:28:43.889  INFO 16554 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1695 ms
2014-09-10 21:28:44.391  INFO 16554 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2014-09-10 21:28:44.393  INFO 16554 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
================== null==================
2014-09-10 21:28:44.606  INFO 16554 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-09-10 21:28:44.679  INFO 16554 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2014-09-10 21:28:44.679  INFO 16554 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[text/html],custom=[]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
2014-09-10 21:28:44.716  INFO 16554 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-09-10 21:28:44.716  INFO 16554 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-09-10 21:28:44.902  INFO 16554 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2014-09-10 21:28:44.963  INFO 16554 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080/http
2014-09-10 21:28:44.965  INFO 16554 --- [           main] foo.Application                          : Started Application in 3.316 seconds (JVM running for 3.822)
^C2014-09-10 21:28:54.223  INFO 16554 --- [       Thread-2] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@67e38ec8: startup date [Wed Sep 10 21:28:42 EST 2014]; root of context hierarchy
2014-09-10 21:28:54.225  INFO 16554 --- [       Thread-2] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown

생성자를 호출한 후 주입이 수행되므로 속성 주입을 수행하는 방법은 작동하지 않습니다.

다음 중 하나를 수행해야 합니다.

뛰어난 솔루션

@Component
public class MyBean {

    private final String prop;

    @Autowired
    public MyBean(@Value("${some.prop}") String prop) {
        this.prop = prop;
        System.out.println("================== " + prop + "================== ");
    }
}

동작하지만 테스트 및 가독성이 다소 떨어지는 솔루션

@Component
public class MyBean {

    @Value("${some.prop}")
    private String prop;

    public MyBean() {

    }

    @PostConstruct
    public void init() {
        System.out.println("================== " + prop + "================== ");
    }
}

또한 스프링 부트에 고유하지 않지만 스프링 애플리케이션에 적용됩니다.

사용자의 "geoand"는 여기서 이유를 지적하고 해결책을 제시하는 것이 옳습니다.그러나 보다 나은 접근법은 Configuration을 별도의 클래스(System Contegration java 클래스 등)로 캡슐화한 후 해당 필드를 사용하는 서비스에 이 클래스를 주입하는 것입니다.

현재의 설정값(@grahamrb)을 서비스에 직접 읽어들이는 방법은 오류가 발생하기 쉬우며 설정명을 변경하면 리팩터링에 문제가 생깁니다.

이 답변은 고객님의 경우에 해당되거나 해당되지 않을 수 있습니다.은 비슷한 번 , ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」@Value설정이 아직 활성화되지 않았습니다. and고 doing doing를 하고 File > Invalidate Cache / Restart 나 my my my my my my IntelliJ(IDE), 문 ( ( ( ( ( ( ( ( ( ( ( (.

이것은 매우 쉽게 시도할 수 있으므로 시도해 볼 가치가 있을 것입니다.

사실, 아래의 저는 괜찮습니다.

@Component
public class MyBean {

   public static String prop;

   @Value("${some.prop}")
   public void setProp(String prop) {
      this.prop= prop;
   }

   public MyBean() {

   }

   @PostConstruct
   public void init() {
      System.out.println("================== " + prop + "================== ");
   }

}

이제 내가 원하는대로, 그냥 호출해

MyBean.prop

값이 반환됩니다.

환경 수업을 이용하면 신청을 받을 수 있습니다.속성 값

@자동설정,

private Environment env;

및 액세스 방법

String password =env.getProperty(your property key);

인수 생성자 코드를 PostConstruct로 옮겼는데 문제가 되지 않았습니다.기본 콩 로드 워크플로우를 그대로 유지합니다.

@Component
public class MyBean {

    @Value("${some.prop}")
    private String prop;

    @PostConstruct
    public void init() {
        System.out.println("================== " + prop + "================== ");
    }
}

다음 절차를 수행합니다. 1:- 다음과 같이 구성 클래스를 만듭니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;

@Configuration
public class YourConfiguration{

    // passing the key which you set in application.properties
    @Value("${some.pro}")
    private String somePro;

   // getting the value from that key which you set in application.properties
    @Bean
    public String getsomePro() {
        return somePro;
    }
}

2:- 컨피규레이션클래스가 있는 경우 필요한 Configuration에서 변수를 삽입합니다.

@Component
public class YourService {

    @Autowired
    private String getsomePro;

    // now you have a value in getsomePro variable automatically.
}

대규모 멀티 모듈 프로젝트에서 작업하고 있는 경우, 여러 개의 다른 모듈로 구성됩니다.application.properties그런 다음 상위 프로젝트의 속성 파일에 값을 추가하십시오.

상위 프로젝트 중 어느 것이 맞는지 모를 경우 프로젝트의pom.xml파일, 의 경우<parent>태그를 붙입니다.

이것으로 나는 그 문제를 해결했다.

사용할 수 있습니다.Environment데이터를 가져올 클래스:

@Autowired
private Environment env;
String prop= env.getProperty('some.prop');

이 문제를 해결한 가장 간단한 솔루션:

더하다@PropertySource채워야 하는 구성 요소/서비스에 대한 주석@Value필드:

@Service
@PropertySource("classpath:myproperties.properties")
public class MyService {

  @Value("${some.prop}")
  private String someProperty;

  // some logic...
}

서비스/컴포넌트와 동일한 모듈의 리소스 폴더에 속성 파일을 추가해야 합니다.

새 키워드로 클래스를 초기화 중이기 때문에 이 오류가 발생합니다.이 문제를 해결하려면 먼저 컨피규레이션클래스를 만들고 이 클래스에서 이 클래스의 bean을 만들어야 합니다.콩을 사용해서 부르면 효과가 있을 거예요.

package ca.testing;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.sql.Connection;
import java.sql.DriverManager;

@Component
@PropertySource("db.properties")
public class ConnectionFactory {
    @Value("${jdbc.user}")
    private String user;
    @Value("${jdbc.password}")
    private String password;
    @Value("${jdbc.url}")
    private String url;
    Connection connection;

    public Connection getConnection(){
        try {
            connection = DriverManager.getConnection(url, user, password);
            System.out.println(connection.hashCode());
        }catch (Exception e){
            System.out.println(e);
        }
        return connection;
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(Config.class);
        ConnectionFactory connectionFactory= context.getBean(ConnectionFactory.class);
        connectionFactory.getConnection();
    }
}

(new Bean()과 같이 다른 클래스에서 키워드 new를 삭제한 후 응용 프로그램 속성이 선택됩니다.

언급URL : https://stackoverflow.com/questions/25764459/spring-boot-application-properties-value-not-populating

반응형