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
'source' 카테고리의 다른 글
MySQL 다중 왼쪽 결합 제한 (0) | 2022.10.29 |
---|---|
반복 요소를 사용하여 목록 작성 (0) | 2022.10.29 |
Python이 virtualenv 내에서 실행 중인지 확인 (0) | 2022.10.29 |
MySQL에서 타임스탬프를 날짜/시간으로 변환하는 방법 (0) | 2022.10.29 |
InnoDB는 600MB 파일 Import에 1시간 이상 소요되며 MyISAM은 몇 분 안에 Import할 수 있습니다. (0) | 2022.10.29 |