I'm working on a Gradle multi-module project with Micronaut and I need help with the following classes and interface in the application
module:
Core project
@Singleton
public record OrderService(IOrderRepository iOrderRepository) implements IOrderService {
@Override
public Optional<Order> findbyId(UUID id) {
return iOrderRepository.findById(id);
}
}
Core project
@Introspected
public interface IOrderRepository{
Optional<Order> findById(@NonNull @NotBlank UUID id);
}
dependency of core project
dependencies {
annotationProcessor "io.micronaut:micronaut-inject-java:${micronautVersion}"
annotationProcessor "io.micronaut:micronaut-validation:${micronautVersion}"
implementation "io.micronaut:micronaut-inject:${micronautVersion}"
implementation "io.micronaut:micronaut-validation:${micronautVersion}"
}
The implementation of IOrderRepository
is in the infrastructure
module as below:
infrastructure project
@Singleton
public record OrderRepository(RootProvider<Root> rootProvider) implements IOrderRepository {
@Override
public Optional<Order> findById(@NonNull UUID id) {
return rootProvider.root().order().get(id);
}
}
dependency of infrastructure
dependencies {
annotationProcessor "io.micronaut:micronaut-inject-java:${micronautVersion}"
annotationProcessor "io.micronaut:micronaut-validation:${micronautVersion}"
implementation "io.micronaut:micronaut-inject:${micronautVersion}"
implementation "io.micronaut:micronaut-validation:${micronautVersion}"
}
Here's a visual representation of the project structure:
The infrastructure
project depends on the core
project. Since the definition of IOrderRepository
is in the core
module and implementation of the IOrderRepository
is in infrastructure
, I'm not sure how to handle the dependencies correctly.
The issue is that OrderRepository
is in different module then the IOrderRepository
module, that doesn't have a dependency. How can I will refer to different module ?
Message: No bean of type [fete.bird.interfaces.IOrderRepository] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).
Path Taken: new $OrderController$Definition$Intercepted(IServiceBus iServiceBus,BeanResolutionContext $beanResolutionContext,BeanContext $beanContext,Qualifier $qualifier,List $interceptors) --> new $OrderController$Definition$Intercepted([IServiceBus iServiceBus],BeanResolutionContext $beanResolutionContext,BeanContext $beanContext,Qualifier $qualifier,List $interceptors) --> new ServiceBus([List handlers]) --> new GetOrderQueryHandler([IOrderService iOrderService]) --> new OrderService([IOrderRepository iOrderRepository])
at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2087)
at io.micronaut.context.AbstractInitializableBeanDefinition.getBeanForConstructorArgument(AbstractInitializableBeanDefinition.java:1297)
at fete.bird.service.$OrderService$Definition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2354)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2305)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2251)
at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3016)
at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80)
at io.micronaut.context.DefaultBeanContext.findOrCreateSingletonBeanRegistration(DefaultBeanContext.java:2918)
at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2879)
at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2800)
GitHub Repo - https://github.com/anandjaisy/order-dependency-issue