Skip to content

Commit 48c3fa9

Browse files
eddumelendezsdeleuze
authored andcommitted
Add visibility support to Jackson2ObjectMapperBuilder
Issue: SPR-16411
1 parent 7fd0cac commit 48c3fa9

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
import java.util.Map;
2828
import java.util.TimeZone;
2929

30+
import com.fasterxml.jackson.annotation.JsonAutoDetect;
3031
import com.fasterxml.jackson.annotation.JsonFilter;
3132
import com.fasterxml.jackson.annotation.JsonInclude;
33+
import com.fasterxml.jackson.annotation.PropertyAccessor;
3234
import com.fasterxml.jackson.core.JsonFactory;
3335
import com.fasterxml.jackson.core.JsonGenerator;
3436
import com.fasterxml.jackson.core.JsonParser;
@@ -91,6 +93,7 @@
9193
* @author Sebastien Deleuze
9294
* @author Juergen Hoeller
9395
* @author Tadaya Tsuyukubo
96+
* @author Eddú Meléndez
9497
* @since 4.1.1
9598
* @see #build()
9699
* @see #configure(ObjectMapper)
@@ -108,6 +111,8 @@ public class Jackson2ObjectMapperBuilder {
108111

109112
private final Map<Class<?>, JsonDeserializer<?>> deserializers = new LinkedHashMap<>();
110113

114+
private final Map<PropertyAccessor, JsonAutoDetect.Visibility> visibilities = new HashMap<>();
115+
111116
private final Map<Object, Boolean> features = new HashMap<>();
112117

113118
private boolean createXmlMapper = false;
@@ -447,6 +452,18 @@ public Jackson2ObjectMapperBuilder defaultUseWrapper(boolean defaultUseWrapper)
447452
return this;
448453
}
449454

455+
/**
456+
* Specify visibility to limit what kind of properties are auto-detected.
457+
* @since 5.1
458+
* @see com.fasterxml.jackson.annotation.PropertyAccessor
459+
* @see com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility
460+
*/
461+
public Jackson2ObjectMapperBuilder visibility(PropertyAccessor accessor,
462+
JsonAutoDetect.Visibility visibility) {
463+
this.visibilities.put(accessor, visibility);
464+
return this;
465+
}
466+
450467
/**
451468
* Specify features to enable.
452469
* @see com.fasterxml.jackson.core.JsonParser.Feature
@@ -669,6 +686,8 @@ else if (this.findWellKnownModules) {
669686
objectMapper.registerModule(module);
670687
}
671688

689+
this.visibilities.forEach(objectMapper::setVisibility);
690+
672691
customizeDefaultFeatures(objectMapper);
673692
this.features.forEach((feature, enabled) -> configureFeature(objectMapper, feature, enabled));
674693

spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2016 the original author or authors.
2+
* Copyright 2002-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -32,8 +32,10 @@
3232
import java.util.Optional;
3333
import java.util.TimeZone;
3434

35+
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
3536
import com.fasterxml.jackson.annotation.JsonFilter;
3637
import com.fasterxml.jackson.annotation.JsonInclude;
38+
import com.fasterxml.jackson.annotation.PropertyAccessor;
3739
import com.fasterxml.jackson.core.JsonGenerator;
3840
import com.fasterxml.jackson.core.JsonParser;
3941
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -87,6 +89,7 @@
8789
* Test class for {@link Jackson2ObjectMapperBuilder}.
8890
*
8991
* @author Sebastien Deleuze
92+
* @author Eddú Meléndez
9093
*/
9194
@SuppressWarnings("deprecation")
9295
public class Jackson2ObjectMapperBuilderTests {
@@ -499,6 +502,19 @@ public void factory() {
499502
}
500503

501504

505+
@Test
506+
public void visibility() throws JsonProcessingException {
507+
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json()
508+
.visibility(PropertyAccessor.GETTER, Visibility.NONE)
509+
.visibility(PropertyAccessor.FIELD, Visibility.ANY)
510+
.build();
511+
512+
String json = objectMapper.writeValueAsString(new JacksonVisibilityBean());
513+
assertThat(json, containsString("property1"));
514+
assertThat(json, containsString("property2"));
515+
assertThat(json, not(containsString("property3")));
516+
}
517+
502518
public static class CustomIntegerModule extends Module {
503519

504520
@Override
@@ -585,4 +601,16 @@ public void setList(List<T> list) {
585601
}
586602
}
587603

604+
public static class JacksonVisibilityBean {
605+
606+
private String property1;
607+
608+
public String property2;
609+
610+
public String getProperty3() {
611+
return null;
612+
}
613+
614+
}
615+
588616
}

0 commit comments

Comments
 (0)