2011-12-18 3 views
2

자바가 제네릭 형식 인수를 사용하여 간단한 일반 메서드를 컴파일 할 수없는 이유를 알아 내려고 노력했지만 대부분이 둘러싼 클래스를 가져올 때만 사용했습니다. 기본적으로, 클래스라는 SpringApplicationContext의 정적 방법으로 스프링 컨텍스트 조작을 노출하고있다 : 나는 같은 패키지에 단위 테스트에서 호출 할 때Java 컴파일러에서 형식 인수가없는 일반 메서드

public static <T> List<T> listBeansOfType(Class<T> type) 
{ 
    return new ArrayList<T>(context.getBeansOfType(type).values()); 
} 

, 그것은 작동합니다. 다음은 테스트 호출입니다.

List<DomainRepo> repos = 
    SpringApplicationContext.listBeansOfType(DomainRepo.class); 

그러나 다른 패키지의 코드에서 호출 할 때 정확히 동일한 코드가 실패합니다. 컴파일러는 심볼 listBeansOfType (java.lang.Class)을 찾을 수 없다고 말합니다. 클래스를 가져 왔지만 메서드에 정적 가져 오기를 수행하지 않았습니다.

낯선 사람이라도 일주일 전에 내가 작성했을 때이 코드가 작동했다는 사실입니다. 그 이후로 릴리스 프로세스를 진행하면서 모든 것을 제쳐두어 둬야했습니다. java 1.6을 사용하여 maven 또는 Eclipse로 컴파일 할 때도 같은 오류가 발생합니다. 어떤 힌트라도 환영받을 것입니다.

+0

이 수업은 공개 되었습니까? –

답변

0

모든 필수 종속성이 있는지 확인하십시오. Junit 테스트가 작동하지만 mvn 컴파일이 실패하면 종속성이 범위 테스트에 포함될 수 있습니다.

<dependency> 
     <groupId>group-a</groupId> 
     <artifactId>artifact-b</artifactId> 
     <version>1.0</version> 
     <scope>TEST</scope> <!-- would explain why you can run your code as junit --> 
    </dependency> 

getBeansOfType() 메소드가 정의 된 "컨텍스트"의 유형을 점검하십시오. mvn 종속성으로 누락되었을 수 있습니다.

+0

감사합니다. 실제로 이것은 잘못된 종속성 이었지만 이처럼 간단하지 않았습니다. 당신의 의견은 의존성 트리를 파헤 치게했고 릴리스 버전에서 마스터 개발 버전으로 업데이트되지 않은 것이있었습니다. – GrampaJohn

+0

음 - 사실, 나는 너무 빨리 말했다. SpringApplicationContext의 이전 버전을 가져온 오래된 의존성이 문제의 방법없이있었습니다. 그러나 그 의존성을 수정해도 증상은 전혀 바뀌지 않았습니다. – GrampaJohn

+0

Eclipse에서 잘못된 캐싱 동작의 희생양이되었다고 생각합니다. ~/.m2/repository의 listBeansOfType() 메소드가 포함 된 모듈을 제거한 후 (이전에 설치하고 제거한 적이 있음) 재 작성 및 Eclipse에서 Maven 종속성을 여러 번 업데이트하면 마침내 멋지게하기로 결정했습니다. 다른 변경 사항이 없습니다 ... – GrampaJohn