Spring @값 주석은 항상 null로 평가합니까?
다음 항목이 포함된 간단한 속성 파일이 있습니다.
my.value=123
another.value=hello world
은 이속파다사로있다습니드를 되고 있습니다.PropertyPlaceHolderConfigurer
위의 속성 파일을 참조합니다.
다음 클래스가 있으며, 이 클래스를 위해 이 속성을 로드하려고 합니다.
public class Config
{
@Value("${my.value}")
private String mValue;
@Value("${another.value}")
private String mAnotherValue;
// More below...
}
문는제,mValue
그리고.mAnotherValue
항상 null입니다...하지만 내 컨트롤러에서는 값이 제대로 로드되고 있습니다.왜 그러고 있어?
를 들어 들어를의 Config
를 통해 .new
그러면 Spring은 관여하지 않기 때문에 주석은 무시됩니다.
콩을 수 ( 봄을 할 것입니다).prototype
-scope bean), 다른 옵션은 Spring의 로드 타임 클래스 로더 위빙 기능을 사용하는 것입니다(문서 참조).이는 일반적인 경우처럼 객체를 인스턴스화할 수 있는 낮은 수준의 AOP이지만 Spring은 객체의 연결, 구성, 초기화 등을 위해 애플리케이션 컨텍스트를 통해 객체를 전달합니다.
그러나 모든 플랫폼에서 사용할 수 있는 것은 아니므로 위의 설명서 링크를 참조하여 사용자에게 적합한지 확인하십시오.
저도 비슷한 문제가 있었지만 스프링의 신입이었습니다.@Service에 속성을 로드하려고 했는데 @Value를 사용하여 속성 값을 검색하려고 했습니다.
@Autowired
public @Value("#{myProperties['myValue']}") String myValue;
저는 하루 종일 다양한 주석 조합을 시도하지만 항상 null을 반환했습니다.결국 답은 언제나처럼 그 사실 뒤에 명백합니다.
Spring이 servlet.xml에 패키지 계층을 포함하여 클래스에서 주석을 검색하는지 확인합니다(사용자가 삽입한 기본값 아래의 모든 항목을 검색합니다).
Spring에게 방금 본 강의를 '신입'하지 않도록 하십시오.대신 @Controller 클래스에서 @Autowire를 사용합니다.
Spring의 모든 것은 Singleton이며, Spring이 Singleton에 값을 로드한 다음 새로 로드된 값을 포함하지 않는 클래스의 다른 인스턴스를 '새로' 추가하여 항상 null이었습니다.
대신 @Controller 사용...
@Autowired
private MyService service;
디버깅 중...제가 이것을 찾기 위해 한 일은 다음과 같이 서비스를 확장하는 것이었습니다.
@Service
public class MyService implements InitializingBean
그런 다음 디버그 문을 입력합니다.
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
LOGGER.debug("property myValue:" + myValue);
}
여기서 초기화에 설정된 값을 확인할 수 있었고, 나중에 방법으로 인쇄했을 때 값이 null이었기 때문에 동일한 인스턴스가 아님을 알 수 있었습니다.
이 오류에 대한 또 다른 단서는 Tomcat이 소켓에서 HTTP 헤더를 구문 분석할 수 없음...을 읽으려고 시도하는 시간 초과에 대해 불평했다는 것입니다.이것은 스프링이 서비스의 인스턴스를 만들었고 저도 마찬가지였기 때문입니다. 제 서비스는 실제 작업을 하고 있었고 스프링은 서비스의 인스턴스를 타임아웃하고 있었습니다.
여기서 제 대답을 보세요.
저도 같은 증상을 겪었습니다.@Value
-선택 필드 있음null
하지만 다른 근본적인 문제가 있습니다.
import com.google.api.client.util.Value;
올바른 항목을 가져오는 중인지 확인합니다.@Value
주석 클래스!특히 요즘 IDE의 편리함으로 인해 이것은 매우 쉽게 실수할 수 있습니다(InteliJ를 사용하고 있으며, 자동으로 가져오는 내용을 읽지 않고 너무 빨리 자동으로 가져오면 저처럼 몇 시간을 낭비할 수 있습니다).
올바른 가져오기는 다음과 같습니다.
org.springframework.beans.factory.annotation.Value
와 함께 작동하므로@Controller
당신은 인스턴스화하고 있는 것처럼 보입니다.Config
네 자신.봄이 그것을 예시하게 하라.
속성을 만들 수도 있습니다.private
당신의 수업이 사용하는 Spring bean인지 확인하세요.@Service
또는@Component
주석을 항상 인스턴스화하고 마지막으로 주석이 달린 세터 방법을 추가합니다.@Value
이렇게 하면 application.properties 또는 yml 구성 파일에 지정된 값이 속성에 할당됩니다.
@Service
public class Config {
private static String myProperty;
private static String myOtherProperty;
@Value("${my.value}")
public void setMyProperty(String myValue) {
this.myProperty = myValue;}
@Value("${other.value}")
public void setMyOtherProperty(String otherValue) {
this.myOtherProperty = otherValue;}
//rest of your code...
}
더하다<context:spring-configured />
응용프로그램 컨텍스트 파일로 이동합니다.
다음을 추가합니다.@Configurable
에 대한 주석.Config
학급.
빈에 있는 필드 중 인스턴스화할 필드를 확인합니다.@Value
그렇지 않습니다(대신).instance
) 주석이 작동하는 데 필요한 Spring Context 로드와 관련된 무언가가 다음 시간까지 발생하지 않을 수 있다고 생각합니다.static initialization
(대신 Spring Context에 인스턴스를 로드해야 합니다.)
다음 항목:
@Value("${my.property.name}")
String myProperty
이 항목이 아님:
@Value("${my.property.name}")
static String myProperty
단위 테스트의 경우, executeScenarioRequest는 항상 null입니다.
@RunWith(SpringRunner.class)
@ExtendWith(MockitoExtension.class)
class ScenarioServiceTestOld {
@Value("classpath:scenario/SampleScenario.json")
Resource executeScenarioRequest;
바꾸다@ExtendWith(MockitoExtension.class)
로.@ExtendWith(SpringExtension.class)
언급URL : https://stackoverflow.com/questions/4130486/spring-value-annotation-always-evaluating-as-null
'sourcecode' 카테고리의 다른 글
PowerShell을 통해 Windows Server에서 IE 보안 사용 안 함 (0) | 2023.08.16 |
---|---|
구조 포인터 내부의 포인터 참조 취소 (0) | 2023.08.16 |
호출-정지 방법 - 자체 서명된 인증서 무시 (0) | 2023.08.16 |
복사 구현 시 모범 사례구역 포함: (0) | 2023.08.11 |
PySpark를 사용하여 CSV 파일 로드 (0) | 2023.08.11 |