Skip to content

Commit

Permalink
Merge pull request #28617 from davidfrickert/#28605
Browse files Browse the repository at this point in the history
Allow disabling Jackson ObjectMapper WRITE_DURATIONS_AS_TIMESTAMPS
  • Loading branch information
gsmet committed Oct 17, 2022
2 parents 9d09ec1 + 35d96ae commit 5c60613
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 0 deletions.
@@ -0,0 +1,38 @@
package io.quarkus.jackson.deployment;

import static org.assertj.core.api.Assertions.assertThat;

import java.time.Duration;

import javax.inject.Inject;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import io.quarkus.test.QuarkusUnitTest;

public class JacksonWriteDurationsAsTimestampsDisabledTest {

@RegisterExtension
static final QuarkusUnitTest config = new QuarkusUnitTest()
.withConfigurationResource("application-write-durations-as-timestamps-disabled.properties");

@Inject
ObjectMapper objectMapper;

@Test
public void testDurationWrittenAsIso8601() throws JsonProcessingException {
Pojo pojo = new Pojo();
pojo.duration = Duration.ofMillis(65542516);

assertThat(objectMapper.writeValueAsString(pojo)).isEqualTo("{\"duration\":\"PT18H12M22.516S\"}");
}

public static class Pojo {

public Duration duration;
}
}
@@ -0,0 +1,38 @@
package io.quarkus.jackson.deployment;

import static org.assertj.core.api.Assertions.assertThat;

import java.time.Duration;

import javax.inject.Inject;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import io.quarkus.test.QuarkusUnitTest;

public class JacksonWriteDurationsAsTimestampsEnabledTest {

@RegisterExtension
static final QuarkusUnitTest config = new QuarkusUnitTest()
.withConfigurationResource("application-write-durations-as-timestamps-enabled.properties");

@Inject
ObjectMapper objectMapper;

@Test
public void testDurationWrittenAsTimestamp() throws JsonProcessingException {
Pojo pojo = new Pojo();
pojo.duration = Duration.ofMillis(65542516);

assertThat(objectMapper.writeValueAsString(pojo)).isEqualTo("{\"duration\":65542.516000000}");
}

public static class Pojo {

public Duration duration;
}
}
@@ -0,0 +1 @@
quarkus.jackson.write-durations-as-timestamps=false
@@ -0,0 +1 @@
quarkus.jackson.write-durations-as-timestamps=true
Expand Up @@ -29,10 +29,19 @@ public class JacksonBuildTimeConfig {

/**
* If enabled, Jackson will serialize dates as numeric value(s).
* When disabled, they are serialized in ISO 8601 format.
*/
@ConfigItem(defaultValue = "false")
public boolean writeDatesAsTimestamps;

/**
* If enabled, Jackson will serialize durations as numeric value(s).
* When disabled, they are serialized in ISO 8601 format.
* This is enabled by default to match the default Jackson behavior.
*/
@ConfigItem(defaultValue = "true")
public boolean writeDurationsAsTimestamps;

/**
* If enabled, Jackson will ignore case during Enum deserialization.
*/
Expand Down
Expand Up @@ -41,6 +41,10 @@ public ObjectMapper objectMapper(@All List<ObjectMapperCustomizer> customizers,
// this feature is enabled by default, so we disable it
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
}
if (!jacksonBuildTimeConfig.writeDurationsAsTimestamps) {
// this feature is enabled by default, so we disable it
objectMapper.disable(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS);
}
if (jacksonBuildTimeConfig.acceptCaseInsensitiveEnums) {
objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS);
}
Expand Down

0 comments on commit 5c60613

Please sign in to comment.