0

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:

enter image description here

enter image description here

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

San Jaisy
  • 15,327
  • 34
  • 171
  • 290

2 Answers2

0

It is great that you have a sample project; however, your sample project uses a non-public dependency. (Cannot build your project)

In your core and infrastructure, use the Micronaut Library Plugin:

plugins {
  id 'io.micronaut.library' version '3.7.10'
}
ShingJo
  • 614
  • 1
  • 7
  • Update the project you can now take the latest and build should be fine. However adding id 'io.micronaut.library' version '3.7.10' also not working. Same issue – San Jaisy Jun 22 '23 at 02:43
0

Adding the below dependency to the API project worked for me

runtimeOnly project(':infrastructure')
San Jaisy
  • 15,327
  • 34
  • 171
  • 290