@Springboot의 값이 null을 반환합니다.
리소스에 있는 application.properties가 있습니다.
응용 프로그램 속성
hsm.provider=software
hsm.name=TestHsm
hsm.port=3001
hsm.ip=127.0.0.1
hsm.timeout=10000
및 컨트롤러
@RestController
@RequestMapping("/hsm")
public class Controller {
@Value("${hsm.ip}")
private String ip;
@Value("${hsm.port}")
private String port;
@Value("${hsm.name}")
private String name;
@Value("${hsm.timeout}")
private String timeout;
@Value("${hsm.provider}")
private String provider;}
}
그러나 응용 프로그램을 실행하면 모든 변수가 NULL로 유지됩니다.제가 무엇을 빠뜨리고 있나요?
EDIT 이것은 src 폴더의 프로젝트 구조입니다.
src
├───main
│ ├───java
│ │ └───com
│ │ └───xyz
│ │ └───hsmservice
│ │ └───hsm
│ │ └───api
│ │ Application.java
│ │ Controller.java
│ │ HSM.java
│ │
│ └───resources
│ │ application.properties
│ │
│ └───META-INF
│ plugin.xml
│
└───test
├───java
│ LibraryTest.java
│
└───resources
EDIT 2 응용 프로그램 클래스입니다.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
패키지 구조로 판단하면 해당 속성은 확실히 로드되어야 합니다.가능한 유일한 옵션은 다음을 인스턴스화하는 것입니다.Controller
로 분류하다.new Controller()
클래스에 주입하는 스프링을 두는 대신에 (사용)@Autowired
또는 생성자 주입).
네, 이 질문의 1위 답변으로 풀었습니다.변수와 @Values를 클래스 변수가 아닌 생성자 서명에 넣었습니다.
@Value가 null을 반환하는 이유는 봄에 허용되지 않는 정적 변수에 대해 'application.properties' 내용을 사용하려고 할 때입니다.다음을 따르십시오. https://mkyong.com/spring/spring-inject-a-value-into-static-variables/ . 그러면 잘 작동할 것입니다.
속성 파일에서 값을 자동으로 할당하는 별도의 클래스를 사용할 수 있습니다.다음과 같은 클래스를 만듭니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Properties {
public static String hsmProvider;
@Autowired
public Properties(@Value("${hsm.provider}") String hsmProvider){
Properties.hsmProvider = hsmProvider;
}
}
당신은 어디서든 부동산을 사용할 수 있습니다.Properties.hsmProvider
스프링 부트 프로젝트에 당신의 코드를 추가했고 그것은 작동 중입니다.
이 53482633 저장소를 확인하고 지침에 따라 저장소를 설치하고 실행하십시오.
또한 코드를 이 응용 프로그램과 비교하여 무엇이 잘못되고 있는지 확인하십시오.
그래도 문제가 생기면 여기에 올려주세요.
이전에도 동일한 문제가 있었고 @Value는 컨트롤러에서 작동하지 않고 구성 요소 클래스에서 작동했기 때문에 아래 솔루션을 사용했습니다.
넌 할 수 있다.@Autowire Environment environment
그리고 나서.environment.getProperty("hsm.provider")
.
참고: 이는 해결 방법일 뿐입니다.
Controller.java
롬복과 함께
package com.example.demo;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/hsm")
@Data
public class Controller {
@Value("${hsm.ip}")
private String ip;
@Value("${hsm.port}")
private String port;
@Value("${hsm.name}")
private String name;
@Value("${hsm.timeout}")
private String timeout;
@Value("${hsm.provider}")
private String provider;
}
롬복 없이(Intelliji가 생성 - Refactor DeLombok)
package com.example.demo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/hsm")
public class Controller {
@Value("${hsm.ip}")
private String ip;
@Value("${hsm.port}")
private String port;
@Value("${hsm.name}")
private String name;
@Value("${hsm.timeout}")
private String timeout;
@Value("${hsm.provider}")
private String provider;
public Controller() {
}
public String getIp() {
return this.ip;
}
public String getPort() {
return this.port;
}
public String getName() {
return this.name;
}
public String getTimeout() {
return this.timeout;
}
public String getProvider() {
return this.provider;
}
public void setIp(String ip) {
this.ip = ip;
}
public void setPort(String port) {
this.port = port;
}
public void setName(String name) {
this.name = name;
}
public void setTimeout(String timeout) {
this.timeout = timeout;
}
public void setProvider(String provider) {
this.provider = provider;
}
public boolean equals(final Object o) {
if (o == this) return true;
if (!(o instanceof Controller)) return false;
final Controller other = (Controller) o;
if (!other.canEqual((Object) this)) return false;
final Object this$ip = this.getIp();
final Object other$ip = other.getIp();
if (this$ip == null ? other$ip != null : !this$ip.equals(other$ip)) return false;
final Object this$port = this.getPort();
final Object other$port = other.getPort();
if (this$port == null ? other$port != null : !this$port.equals(other$port)) return false;
final Object this$name = this.getName();
final Object other$name = other.getName();
if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;
final Object this$timeout = this.getTimeout();
final Object other$timeout = other.getTimeout();
if (this$timeout == null ? other$timeout != null : !this$timeout.equals(other$timeout)) return false;
final Object this$provider = this.getProvider();
final Object other$provider = other.getProvider();
if (this$provider == null ? other$provider != null : !this$provider.equals(other$provider)) return false;
return true;
}
protected boolean canEqual(final Object other) {
return other instanceof Controller;
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
final Object $ip = this.getIp();
result = result * PRIME + ($ip == null ? 43 : $ip.hashCode());
final Object $port = this.getPort();
result = result * PRIME + ($port == null ? 43 : $port.hashCode());
final Object $name = this.getName();
result = result * PRIME + ($name == null ? 43 : $name.hashCode());
final Object $timeout = this.getTimeout();
result = result * PRIME + ($timeout == null ? 43 : $timeout.hashCode());
final Object $provider = this.getProvider();
result = result * PRIME + ($provider == null ? 43 : $provider.hashCode());
return result;
}
public String toString() {
return "Controller(ip=" + this.getIp() + ", port=" + this.getPort() + ", name=" + this.getName() + ", timeout=" + this.getTimeout() + ", provider=" + this.getProvider() + ")";
}
}
데모 응용 프로그램.자바
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class DemoApplication {
@Autowired
Controller controller;
public static void main(String[] args) {
try (ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class, args)) {
DemoApplication app = ctx.getBean(DemoApplication.class);
app.run(args);
} catch (Exception e) {
e.printStackTrace();
}
}
public void run(String... args) throws Exception {
System.out.println(controller);
}
}
출력:Controller(ip=127.0.0.1, port=3001, name=TestHsm, timeout=1000, provider=software)
서비스 파일에서 @Value를 수행할 때도 같은 문제가 있었습니다.컨트롤러 파일에서 새 서비스를 만들고 있었습니다.
작동하지 않음:
UserController.java
UserService userService = new UserService();
String user = userService.getUser(); // NULL!!
사용자 서비스.자바
public class UserService {
@Value("${hello.world}")
String hello;
public String GetUser() {
return hello; // NULL!!
}
}
내 UserService 파일의 주입을 무시한 것입니다.
대신 컨트롤러 파일에서 @Value injection을 수행하고 이 변수를 서비스 생성자에게 전달했습니다.
작업:
UserController.java
@Value("${hello.world}")
String hello;
UserService userService = new UserService(hello);
사용자 서비스.자바
public class UserService {
private String hello;
// constructor
public UserService(@Value("${hello.world}") String hello) {
this.hello = hello;
}
}
@다음 이유로 인해 값이 null을 반환하므로 확인하십시오.
1.@Value를 사용하는 클래스는 구성 요소, 서비스, 리포지토리 등의 스프링 초기화 클래스로 선언되지 않습니다.그래서 그 수업을 봄 관리 수업으로 만듭니다.
@Component
class ClassA {
@Value("${property.value}")
private String valueString;
}
OR
@Service
class ClassA {
@Value("${property.value}")
private String valueString;
}
OR
@Repository
class ClassA {
@Value("${property.value}")
private String valueString;
}
2.이 클래스에서 메서드를 호출하는 위치에서 이 클래스를 새로 초기화된 개체로 전달해야 합니다.호출 클래스의 클래스를 @Autowire한 다음 메소드를 사용해야 합니다.
@Component
public class ClassA {
private final String propertyValue;
@Autowired
public ClassA(@Value("${propery.value}") String propertyValue) {
this.propertyValue = propertyValue;
}
}
답은 매우 간단합니다. 저는 같은 문제를 겪었습니다. 그래서 저는 아무도 그것을 다시 마주하지 않도록 여기에 이 글을 씁니다.
클래스의 빈에 주입된 값을 사용하기 위해 사용합니다.
주입이 수행된 클래스를 값을 사용할 다른 클래스로 자동 배선해야 합니다.
그리고 주입된 밸브는 절대 null이 아닐 것입니다.
스프링이 자동 배선과 함께 시작되면 콩은 항상 null이 아닌 값으로 가져옵니다.
언급URL : https://stackoverflow.com/questions/53482633/value-in-springboot-returns-null
'programing' 카테고리의 다른 글
코드의 최신 버전을 얻으려면 어떻게 해야 합니까? (0) | 2023.06.30 |
---|---|
긴 형식에서 넓은 형식으로 데이터를 재구성하는 방법 (0) | 2023.06.30 |
pip3로 패키지를 설치할 때 "Python에서 ssl 모듈을 사용할 수 없습니다. (0) | 2023.06.30 |
.gitignore를 사용하여 특정 디렉터리를 제외한 모든 항목 무시 (0) | 2023.06.30 |
Yup/Formik에서 기본 오류 텍스트를 변경하는 방법? (0) | 2023.06.30 |