I need to inject by @Autowired concrete implementation of a service class.
Service interface:
public interface PostService {
...
}
Implementation:
@Service("postServiceImpl")
public class PostServiceImpl implements PostService {
...
}
Methods in the service are with @ Transactional annotation
And now I want to inject postServiceImpl to my controller - because I need to use one method from the implementation, that is not in the interface:
@Autowired
@Qualifier("postServiceImpl")
private PostServiceImpl postService;
I get NoSuchBeanDefinitionException with the following message:
No qualifying bean of type [ (...) .PostServiceImpl] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.
when I change the field in my controller to:
private PostService postService
it works, but I can't use a specific method from PostServiceImpl.
Since your methods are annotated @Transactional
, spring will create proxy at runtime, to inject transaction management code. By default Spring uses JDK Dynamic Proxy for proxying mechanism, which proxies based on interfaces.
So, in this case, spring creates another class which implements PostService
interface, and creates bean of that class. Definitely that cannot be autowired to PostServiceImpl
, as those are siblings. However, if you really want to autowire on class, you can force spring to use CGLib proxy instead, which proxies using subclassing. That you can do by setting proxyTargetClass=true
in your @EnableTransactionManagement
annotation, if you're using Java based config.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With