sourcecode

Spring @값 주석은 항상 null로 평가합니까?

codebag 2023. 8. 16. 22:12
반응형

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

반응형