I'm having similar issue to this Unexpected error occurred: Micronaut Data method is missing compilation time query information .. but the fix didn't work for me. I have 2 micronaut apps, Contact and User services, which i recently wanted to migrate from micronaut 3.9 to 4.9.1. I'm not having any issues running the User service, but the Contact service does throw:
Error received when calling an http endpoint which calls MongoDBContactRepository::saveAll()
Internal Server Error: Micronaut Data method is missing compilation time query information. Ensure that the Micronaut Data annotation processors are declared in your build and try again with a clean re-build.
The poms.xml are almost similar, not sure why it works for one but not the other, here are the pom.xml for each:
User service's pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.market.online</groupId>
<artifactId>user-microservice</artifactId>
<version>1.0</version>
<packaging>${packaging}</packaging>
<parent>
<groupId>io.micronaut.platform</groupId>
<artifactId>micronaut-parent</artifactId>
<version>4.9.1</version>
</parent>
<properties>
<packaging>jar</packaging>
<jdk.version>17</jdk.version>
<release.version>17</release.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<micronaut.runtime>netty</micronaut.runtime>
<micronaut.aot.enabled>false</micronaut.aot.enabled>
<micronaut.aot.packageName>com.market.online.aot.generated</micronaut.aot.packageName>
<micronaut.test.resources.enabled>true</micronaut.test.resources.enabled>
<exec.mainClass>com.market.online.Application</exec.mainClass>
</properties>
<dependencies>
<dependency>
<groupId>io.micronaut.security</groupId>
<artifactId>micronaut-security-oauth2</artifactId>
<version>${micronaut.security.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.security</groupId>
<artifactId>micronaut-security-annotations</artifactId>
<version>${micronaut.security.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.market.online</groupId>
<artifactId>market-online-commons-library-m4</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>io.micronaut.maven</groupId>
<artifactId>micronaut-maven-plugin</artifactId>
<configuration>
<aotDependencies>
<dependency>
<groupId>io.micronaut.security</groupId>
<artifactId>micronaut-security-aot</artifactId>
<version>${micronaut.security.version}</version>
</dependency>
</aotDependencies>
<configFile>aot-${packaging}.properties</configFile>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths combine.self="override">
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject-java</artifactId>
<version>${micronaut.core.version}</version>
</path>
<path>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-processor</artifactId>
<version>${micronaut.data.version}</version>
<exclusions>
<exclusion>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject</artifactId>
</exclusion>
</exclusions>
</path>
<path>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-document-processor</artifactId>
<version>${micronaut.data.version}</version>
<exclusions>
<exclusion>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject</artifactId>
</exclusion>
</exclusions>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-graal</artifactId>
<version>${micronaut.core.version}</version>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-http-validation</artifactId>
<version>${micronaut.core.version}</version>
</path>
<path>
<groupId>io.micronaut.security</groupId>
<artifactId>micronaut-security-annotations</artifactId>
<version>${micronaut.security.version}</version>
<exclusions>
<exclusion>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject</artifactId>
</exclusion>
</exclusions>
</path>
<path>
<groupId>io.micronaut.openapi</groupId>
<artifactId>micronaut-openapi</artifactId>
<version>${micronaut.openapi.version}</version>
<exclusions>
<exclusion>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject</artifactId>
</exclusion>
</exclusions>
</path>
<path>
<groupId>io.micronaut.validation</groupId>
<artifactId>micronaut-validation-processor</artifactId>
<version>${micronaut.validation.version}</version>
<exclusions>
<exclusion>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject</artifactId>
</exclusion>
</exclusions>
</path>
</annotationProcessorPaths>
<compilerArgs>
<arg>-Amicronaut.processing.group=com.market.online</arg>
<arg>-Amicronaut.processing.module=user-microservice</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
</project>
Contact service's pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.market.online</groupId>
<artifactId>contact-microservice</artifactId>
<version>1.0</version>
<packaging>${packaging}</packaging>
<parent>
<groupId>io.micronaut.platform</groupId>
<artifactId>micronaut-parent</artifactId>
<version>4.9.1</version>
</parent>
<properties>
<packaging>jar</packaging>
<jdk.version>17</jdk.version>
<release.version>17</release.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<micronaut.runtime>netty</micronaut.runtime>
<micronaut.aot.enabled>false</micronaut.aot.enabled>
<micronaut.aot.packageName>com.market.online.aot.generated</micronaut.aot.packageName>
<micronaut.test.resources.enabled>true</micronaut.test.resources.enabled>
<exec.mainClass>com.market.online.Application</exec.mainClass>
</properties>
<dependencies>
<dependency>
<groupId>com.market.online</groupId>
<artifactId>market-online-commons-library-m4</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>io.micronaut.maven</groupId>
<artifactId>micronaut-maven-plugin</artifactId>
<configuration>
<aotDependencies>
<dependency>
<groupId>io.micronaut.security</groupId>
<artifactId>micronaut-security-aot</artifactId>
<version>${micronaut.security.version}</version>
</dependency>
</aotDependencies>
<configFile>aot-${packaging}.properties</configFile>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths combine.self="override">
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject-java</artifactId>
<version>${micronaut.core.version}</version>
</path>
<path>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-processor</artifactId>
<version>${micronaut.data.version}</version>
<exclusions>
<exclusion>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject</artifactId>
</exclusion>
</exclusions>
</path>
<path>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-document-processor</artifactId>
<version>${micronaut.data.version}</version>
<exclusions>
<exclusion>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject</artifactId>
</exclusion>
</exclusions>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-graal</artifactId>
<version>${micronaut.core.version}</version>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-http-validation</artifactId>
<version>${micronaut.core.version}</version>
</path>
<path>
<groupId>io.micronaut.security</groupId>
<artifactId>micronaut-security-annotations</artifactId>
<version>${micronaut.security.version}</version>
<exclusions>
<exclusion>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject</artifactId>
</exclusion>
</exclusions>
</path>
<path>
<groupId>io.micronaut.openapi</groupId>
<artifactId>micronaut-openapi</artifactId>
<version>${micronaut.openapi.version}</version>
<exclusions>
<exclusion>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject</artifactId>
</exclusion>
</exclusions>
</path>
<path>
<groupId>io.micronaut.validation</groupId>
<artifactId>micronaut-validation-processor</artifactId>
<version>${micronaut.validation.version}</version>
<exclusions>
<exclusion>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject</artifactId>
</exclusion>
</exclusions>
</path>
</annotationProcessorPaths>
<compilerArgs>
<arg>-Amicronaut.processing.group=com.market.online</arg>
<arg>-Amicronaut.processing.module=contact-microservice</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
</project>
They both use a custom library market-online-commons-library-m4
which holds all dependancies, here's its pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.market.online</groupId>
<artifactId>market-online-commons-library-m4</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Framework -->
<micronaut.http.server.netty.version>4.9.7</micronaut.http.server.netty.version>
<micronaut.inject.java.version>4.9.7</micronaut.inject.java.version>
<micronaut.data.model.version>4.13.2</micronaut.data.model.version>
<micronaut.data.processor.version>4.13.2</micronaut.data.processor.version>
<micronaut.data.document.processor.version>4.13.2</micronaut.data.document.processor.version>
<micronaut.jackson.databind.version>4.9.7</micronaut.jackson.databind.version>
<micronaut.mongo.reactive.version>5.7.0</micronaut.mongo.reactive.version>
<micronaut.http.client.version>4.9.7</micronaut.http.client.version>
<micronaut.reactor.http.client.version>3.8.0</micronaut.reactor.http.client.version>
<micronaut.retry.version>4.9.7</micronaut.retry.version>
<micronaut.redis.lettuce.version>6.8.0</micronaut.redis.lettuce.version>
<micronaut.elasticsearch.version>5.0.1</micronaut.elasticsearch.version>
<micronaut.rabbitmq.version>4.8.0</micronaut.rabbitmq.version>
<micronaut.validation.version>4.10.0</micronaut.validation.version>
<micronaut.security.version>4.13.0</micronaut.security.version>
<micronaut.management.version>4.9.7</micronaut.management.version>
<micronaut.openapi.annotations.version>6.17.3</micronaut.openapi.annotations.version>
<micronaut.test.resources.client>2.9.0</micronaut.test.resources.client>
<micronaut.test.rest.assured.version>4.8.1</micronaut.test.rest.assured.version>
<micronaut.test.junit5.version>4.8.1</micronaut.test.junit5.version>
<junit.jupiter.api.version>5.12.2</junit.jupiter.api.version>
<junit.jupiter.engine.version>5.12.2</junit.jupiter.engine.version>
<junit.platform.suite.engine.version>1.12.2</junit.platform.suite.engine.version>
<!-- Libraries-->
<reactor.version>3.8.0</reactor.version>
<mongodb.driver.reactivestreams>4.11.5</mongodb.driver.reactivestreams>
<apache.http.async.client.version>4.1.5</apache.http.async.client.version>
<jakarta.validation.api.version>3.1.1</jakarta.validation.api.version>
<jakarta.annotation.api.version>2.1.1</jakarta.annotation.api.version>
<lombok.version>1.18.26</lombok.version>
<javax.validation.api.version>2.0.1.Final</javax.validation.api.version>
<logback.classic.version>1.5.18</logback.classic.version>
<assertj.core.version>3.23.1</assertj.core.version>
<snakeyaml.version>2.4</snakeyaml.version>
<context.propagation.version>1.1.3</context.propagation.version>
</properties>
<dependencies>
<!-- Core -->
<dependency>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-http-server-netty</artifactId>
<version>${micronaut.http.server.netty.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.reactor</groupId>
<artifactId>micronaut-reactor</artifactId>
<version>${reactor.version}</version>
<scope>compile</scope>
</dependency>
<!-- Data -->
<dependency>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-jackson-databind</artifactId>
<version>${micronaut.jackson.databind.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-mongodb</artifactId>
<version>${micronaut.data.model.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.mongodb</groupId>
<artifactId>micronaut-mongo-reactive</artifactId>
<version>${micronaut.mongo.reactive.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-model</artifactId>
<version>${micronaut.data.model.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-reactivestreams</artifactId>
<version>${mongodb.driver.reactivestreams}</version>
<scope>compile</scope>
</dependency>
<!-- Cache -->
<dependency>
<groupId>io.micronaut.redis</groupId>
<artifactId>micronaut-redis-lettuce</artifactId>
<version>${micronaut.redis.lettuce.version}</version>
<scope>compile</scope>
</dependency>
<!-- Indexing -->
<dependency>
<groupId>io.micronaut.elasticsearch</groupId>
<artifactId>micronaut-elasticsearch</artifactId>
<version>${micronaut.elasticsearch.version}</version>
<scope>compile</scope>
</dependency>
<!-- Queue -->
<dependency>
<groupId>io.micronaut.rabbitmq</groupId>
<artifactId>micronaut-rabbitmq</artifactId>
<version>${micronaut.rabbitmq.version}</version>
</dependency>
<!-- Http -->
<dependency>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-http-client</artifactId>
<version>${micronaut.http.client.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.reactor</groupId>
<artifactId>micronaut-reactor-http-client</artifactId>
<version>${micronaut.reactor.http.client.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-retry</artifactId>
<version>${micronaut.retry.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>${apache.http.async.client.version}</version>
</dependency>
<!-- Security -->
<dependency>
<groupId>io.micronaut.security</groupId>
<artifactId>micronaut-security</artifactId>
<version>${micronaut.security.version}</version>
</dependency>
<dependency>
<groupId>io.micronaut.security</groupId>
<artifactId>micronaut-security-jwt</artifactId>
<version>${micronaut.security.version}</version>
<scope>compile</scope>
</dependency>
<!-- Validation -->
<dependency>
<groupId>io.micronaut.validation</groupId>
<artifactId>micronaut-validation</artifactId>
<version>${micronaut.validation.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>${jakarta.validation.api.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>${jakarta.annotation.api.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>${javax.validation.api.version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.classic.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Documentation -->
<dependency>
<groupId>io.micronaut.openapi</groupId>
<artifactId>micronaut-openapi-annotations</artifactId>
<version>${micronaut.openapi.annotations.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>${snakeyaml.version}</version>
<scope>compile</scope>
</dependency>
<!-- Management -->
<dependency>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-management</artifactId>
<version>${micronaut.management.version}</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>context-propagation</artifactId>
<version>${context.propagation.version}</version>
<scope>compile</scope>
</dependency>
<!-- Utils -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>compile</scope>
</dependency>
<!-- Testing -->
<dependency>
<groupId>io.micronaut.testresources</groupId>
<artifactId>micronaut-test-resources-client</artifactId>
<version>${micronaut.test.resources.client}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.test</groupId>
<artifactId>micronaut-test-rest-assured</artifactId>
<version>${micronaut.test.rest.assured.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.test</groupId>
<artifactId>micronaut-test-junit5</artifactId>
<version>${micronaut.test.junit5.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.jupiter.api.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.engine.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite-engine</artifactId>
<version>${junit.platform.suite.engine.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assertj.core.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.14.0</version>
<configuration>
<annotationProcessorPaths combine.self="override">
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject-java</artifactId>
<version>${micronaut.inject.java.version}</version>
</path>
<path>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-processor</artifactId>
<version>${micronaut.data.processor.version}</version>
</path>
<path>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-document-processor</artifactId>
<version>${micronaut.data.document.processor.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>
I don't think the error comes from the custom library, because i did a copy paste of all its dependancies and used them directly on the Contact service's pom.xml and the issue was still there. Plus, the user service is working like a charm.
What's weird, is that, if i edit the MongoDBContactRepository file in anyway, for example adding a space, and re-running the app, it works without the error, but if i do a mvn clean compile
.. the issue happens again which blocks my compilation pipeline.
I think there must be an issue with the annotation processing somewhere, but I don't know how to fix it.
I finally found the issue, i had some functions on my persistable entity, which were causing issues, i moved them to another class as static methods and kept the persistable entity holding the properties only, and this seemed to allow the annotation processor to treat the class.
I'm still curious to understand why the annotation processor was not generating metadata during compile time when the class had other methods in it though.
Old class code:
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Introspected
@MappedEntity("contacts")
public class Contact implements IdentifiableEntity, SearchableEntity {
@Id
@GeneratedValue
@BsonProperty("_id")
private String id;
@NotNull
private String name;
private String address;
private String phoneNumber;
private String email;
private LocalDateTime createdAt;
public Contact cloneAndSetName(String name) {
return cloneBuilder()
.name(name)
.build();
}
public ContactBuilder cloneBuilder() {
return Contact.builder()
.id(getId())
.name(getName())
.email(getEmail())
.address(getAddress())
.phoneNumber(getPhoneNumber())
}
}
New class code:
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Introspected
@MappedEntity("contacts")
public class Contact implements IdentifiableEntity, SearchableEntity {
@Id
@GeneratedValue
@BsonProperty("_id")
private String id;
@NotNull
private String name;
private String address;
private String phoneNumber;
private String email;
private LocalDateTime createdAt;
// Moved these functions to another class (Helper class)
}