I am trying to build a POST call using Micronaut. Whenever I hit the API from POSTMAN, I always get body as “Optional.empty” in the server.
Controller :-
import io.micronaut.core.annotation.NonNull;
import io.micronaut.http.HttpHeaders;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.*;
import jakarta.inject.Inject;
import lombok.extern.log4j.Log4j2;
import java.util.Objects;
@Controller("/abc/v1")
@Log4j2
public class AbcController {
@Post("/get-new-user-referral-code")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.TEXT_PLAIN)
@WithSpan
public GetReferralCodeResponse getNewUserReferralCode(HttpRequest<?> request) {
String body = request.getBody().toString();
HttpHeaders headers = request.getHeaders();
log.info("Body = {}", body);
return apiResponse;
}
}
build.gradle :-
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
plugins {
id("com.github.johnrengelman.shadow") version "8.1.1"
id("io.micronaut.application") version "4.4.0"
id("io.micronaut.aot") version "4.4.0"
id("groovy")
id("jacoco")
}
version = "0.1"
group = "com.abc"
repositories {
mavenCentral()
}
dependencies {
annotationProcessor("io.micronaut:micronaut-http-validation")
annotationProcessor("io.micronaut.serde:micronaut-serde-processor")
implementation("io.micronaut.serde:micronaut-serde-jackson")
implementation("io.micronaut:micronaut-management")
implementation("io.micronaut:micronaut-http-client")
implementation 'jakarta.annotation:jakarta.annotation-api:2.1.1'
implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0'
compileOnly 'org.projectlombok:lombok:1.18.30'
annotationProcessor 'org.projectlombok:lombok:1.18.30'
testCompileOnly 'org.projectlombok:lombok:1.18.30'
implementation 'software.amazon.awssdk:bom'
implementation 'software.amazon.awssdk:appconfigdata'
implementation 'software.amazon.awssdk:sts'
implementation 'software.amazon.awssdk:netty-nio-client:2.24.3'
implementation 'io.netty:netty-codec-http:4.1.108.Final'
implementation 'com.github.luben:zstd-jni:1.5.6-6'
implementation 'software.amazon.awssdk:apache-client:2.20.69'
implementation("software.amazon.awssdk:url-connection-client:2.17+")
implementation 'com.amazonaws:aws-lambda-java-core:1.2.3'
implementation 'software.amazon.awssdk:lambda:2.17.206'
implementation 'software.amazon.awssdk:dynamodb'
implementation 'software.amazon.awssdk:dynamodb-enhanced'
implementation 'software.amazon.awssdk:sns'
implementation 'software.amazon.awssdk:sqs'
implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
implementation 'org.json:json:20231013'
implementation 'org.jsonschema2pojo:jsonschema2pojo-core:1.2.1'
// opentelemetry
implementation("io.opentelemetry:opentelemetry-exporter-otlp")
implementation('io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations:2.3.0')
implementation("io.opentelemetry:opentelemetry-exporter-logging")
implementation("io.opentelemetry:opentelemetry-sdk")
implementation("io.reactivex.rxjava2:rxjava:2.2.21")
testAnnotationProcessor 'io.micronaut:micronaut-inject-java'
implementation("io.micronaut.kafka:micronaut-kafka")
developmentOnly("io.micronaut.controlpanel:micronaut-control-panel-ui")
developmentOnly("io.micronaut.controlpanel:micronaut-control-panel-management")
implementation("io.micronaut.objectstorage:micronaut-object-storage-aws")
testImplementation 'org.mockito:mockito-core:3.12.4'
}
application {
mainClass = "com.abc.Application"
}
java {
sourceCompatibility = JavaVersion.toVersion("21")
targetCompatibility = JavaVersion.toVersion("21")
}
graalvmNative.toolchainDetection = false
micronaut {
runtime("netty")
testRuntime("junit5")
processing {
incremental(true)
annotations("com.abc.*")
}
aot {
// Please review carefully the optimizations enabled below
// Check https://micronaut-projects.github.io/micronaut-aot/latest/guide/ for more details
optimizeServiceLoading = false
convertYamlToJava = false
precomputeOperations = true
cacheEnvironment = true
optimizeClassLoading = true
deduceEnvironment = true
optimizeNetty = true
replaceLogbackXml = true
}
}
tasks.named("dockerfileNative") {
jdkVersion = "21.0.4"
}
Logs
"Unrecognized token 'Optional': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')n at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled)
Curl Request :-
curl --location 'http://localhost:8080/referrals/v1/get-new-user-referral-code'
--header 'Content-Length: 1000'
--header 'Content-Type: text/plain'
--data 'abc'
I have tried multiple changes from documentations available but no luck.
Can someone please help me understand why I am receiving empty body in the request.
GET requests are working fine.
I am also able to receive all the headers in the api.
Only issue is with body
holeInWater is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
0