Spring - @Autowired jest nullem

0

Witam mam problem z adnotacja Autowired.

Klasa testowa

@Component
public class Test {

	@Autowired
	public static PersonService PersonService;

	public static void main(String[] args) {
		System.out.println(PersonService);
	}
}

Serwis i implementacja

public interface SystemVersionService {
	public SystemVersionData findById(String version);
}



@Service
public class SystemVersionServiceImpl implements SystemVersionService {
	
	@Autowired
	private final SystemVersionRepository systemVersionRepository;

	public SystemVersionServiceImpl(SystemVersionRepository systemVersionRepository) {		
		this.systemVersionRepository = systemVersionRepository;
	}

	@Override
    @Transactional
	public SystemVersionData findById(String version) {
		return systemVersionRepository.findById(version);
	}
}

Repozytorium i implementacja

@Repository
@Transactional
public class SystemVersionRepositoryImpl implements SystemVersionRepository {
	@Override
	public SystemVersionData findById(String version) {		
		return null;
	}
}


public interface SystemVersionRepository extends Repository<SystemVersionData, String> {
	SystemVersionData findById(String version);
}

Gdy probowałem dodac adnotacje @SpringBootApplication do klasy Test i

ApplicationContext ctx = SpringApplication.run(Test.class, args);

leci mi bład:

Error creating bean with name 'dataSourceInitializerPostProcessor': Injection of autowired dependencies failed; nested exception is java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotatedElementUtils.forAnnotations([Ljava/lang/annotation/Annotation;)Ljava/lang/reflect/AnnotatedElement;

Mógłby mi koś pomóc?

1

Po pierwsze to wywal to final z deklaracji wstrzykiwanego pola. Po drugie wywal to static z deklaracji wstrzykiwanego pola. No i nie pokazałeś czy na pewno skanujesz poprawnie wszystkie pakiety.

0

usunałem final ale static nie moge usunąc bo wtedy nie bede mógł użyc tego Serwisu w main.

@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
@ComponentScan()
public class Configuration{
//
}
0

A czy klasa Test jest w tym samym pakiecie co Configuration? Jeśli nie to musisz też podać pakiet do skanowania w @ComponentScan

0

w klasie Test musze dodac tez @ComponentScan ?

0

Nie, w klasie Configuration powinieneś podać pakiet w @ComponentScan

0

podałem ale dalej to nic nie dało

1

ale static nie moge usunąc bo wtedy nie bede mógł użyc tego Serwisu w main.

I nie powinieneś bo ty chcesz korzystać z beana wstrzykniętego do komponentu przez Springa wiec siłą rzeczy musisz operować na obiektach zarządzanych przez Springa a nie na jakichś statycznych operacjach. Musisz sobie tego beana pobrać ze springowego kontekstu, więc np. to twoje

Test component = ctx.getBean(Test.class);
1

Final musisz usunąć bo wstrzykujesz najgorszą możliwą metodą. Wstrzykiwanie za pomocą @Autowired nad polami powoduje, że klasa ma +10 do trudności testowania. Nie utworzysz już jej nigdy (np. na potrzeby testu bez pomocy Springa)

Dlatego dałbym @Autowired nad konstruktorem, a pole zostawił final, żeby wyrazić jasno intencję, że ta referencja się nigdy nie zmienia.

Co do static to nie ma to żadnego sensu i wyraźnie nie rozumiesz idei Dependency Injection.

Jeżeli używasz SpringBoot to on dodaje automatycznie ComponentScan od pakietu z @SpringBootApplication w głąb. Jeżeli nie używasz SB to musisz dodać @ComponentScan i określić pakiet do skanowania.

3

@nie100sowny jak testujesz to tosterem to jasne że nie potestujesz. Ale już Easymock czy Mockito spokojnie potrafią testować injectowanie, zaręczam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1