fix(api): preserve null data in response envelopes

This commit is contained in:
2026-09-30 11:18:40 +08:00
parent e5832d5c67
commit c7945ad8fd
3 changed files with 47 additions and 1 deletions
+1
View File
@@ -14,6 +14,7 @@
<name>baiyue-common-core</name> <name>baiyue-common-core</name>
<dependencies> <dependencies>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId></dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency>
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
@@ -1,5 +1,7 @@
package com.baiyue.common.core.api; package com.baiyue.common.core.api;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.time.Instant; import java.time.Instant;
/** /**
@@ -8,7 +10,7 @@ import java.time.Instant;
public record ApiResponse<T>( public record ApiResponse<T>(
String code, String code,
String message, String message,
T data, @JsonInclude(JsonInclude.Include.ALWAYS) T data,
String requestId, String requestId,
String traceId, String traceId,
Instant timestamp) { Instant timestamp) {
@@ -0,0 +1,43 @@
package com.baiyue.common.web;
import com.baiyue.common.core.api.ApiResponse;
import com.baiyue.common.core.api.ResultCode;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat;
class ApiResponseSerializationTest {
@Test
void preservesEnvelopeDataUnderNonNullConfiguration() {
new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class))
.withPropertyValues("spring.jackson.default-property-inclusion=non_null")
.run(context -> {
ObjectMapper mapper = context.getBean(ObjectMapper.class);
JsonNode success = mapper.readTree(mapper.writeValueAsString(ApiResponse.success(null)));
assertThat(success.path("code").asText()).isEqualTo("200");
assertThat(success.has("data")).isTrue();
assertThat(success.get("data").isNull()).isTrue();
assertThat(success.has("requestId")).isFalse();
JsonNode failure = mapper.readTree(mapper.writeValueAsString(
ApiResponse.failure(ResultCode.CONFLICT, "conflict", "request-1", "trace-1")));
assertThat(failure.path("code").asText()).isEqualTo("A0409");
assertThat(failure.has("data")).isTrue();
assertThat(failure.get("data").isNull()).isTrue();
assertThat(failure.path("requestId").asText()).isEqualTo("request-1");
assertThat(failure.path("traceId").asText()).isEqualTo("trace-1");
JsonNode populated = mapper.readTree(mapper.writeValueAsString(
ApiResponse.success(Map.of("status", "SUBMITTED"))));
assertThat(populated.path("data").path("status").asText()).isEqualTo("SUBMITTED");
});
}
}