fix(api): preserve null data in response envelopes
This commit is contained in:
@@ -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");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user