Issue
I have an issue: repository bean couldn't be found when it's placed in outer package. It causes nested UnsatisfiedDependencyException
which is due to NoSuchBeanDefinitionException
(expected at least 1 bean which qualifies as autowire candidate).
After I copied the class to my project, it works perfectly. But I would like to use it as a dependency on external module.
This is repository class:
@Repository
public interface PersonRepository extends ReactiveMongoRepository<Person, String> {
}
And classes from project that should use the repository:
@Configuration
@ComponentScan("outer.package.repository")
@EnableMongoRepositories(basePackages = {
"outer.package.repository"
//"local.package.repository" // temporary solution, should be external
})
public class MyConfig {
}
@Service
@RequiredArgsConstructor
public class PersonService {
private final PersonRepository personRepository;
// do some stuff
}
As you see, I have all needed annotations on beans (@Repository
, @Service
, @Configuration
), I registered mongo repositories (@EnableMongoRepositories
) and even provided the directory to scan (@ComponentScan
). Do you have any ideas what I've missed?
UPD: I'm using maven and project structure is like this:
src
main
java
com
example
configuration
MyConfig.java
controller
PersonController.java
repository
PersonRepository.java
service
PersonService.java
MainApplication.java
resources
test
pom.xml
Solution
I've tried to reproduce the issue and it seems that changing the annotation
@EnableMongoRepositories(basePackages = {
"outer.package.repository"
//"local.package.repository" // temporary solution, should be external
})
public class MyConfig {}
to its reactive equivalent:
@EnableReactiveMongoRepositories(basePackages = {
"outer.package.repository"
//"local.package.repository" // temporary solution, should be external
})
public class MyConfig {}
solved the issue. More on that in the documentation
MongoDB uses two different drivers for imperative (synchronous/blocking) and reactive (non-blocking) data access. You must create a connection by using the Reactive Streams driver to provide the required infrastructure for Spring Data’s Reactive MongoDB support. Consequently, you must provide a separate configuration for MongoDB’s Reactive Streams driver. Note that your application operates on two different connections if you use reactive and blocking Spring Data MongoDB templates and repositories.
Answered By - kasptom
Answer Checked By - Timothy Miller (JavaFixing Admin)