Fixed [JACKSON-806]
diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition.java b/src/main/java/com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition.java
index d3f67e7..145d163 100644
--- a/src/main/java/com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition.java
+++ b/src/main/java/com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition.java
@@ -50,6 +50,17 @@
*/
public abstract String getInternalName();
+ /**
+ * Accessor that can be called to check whether property was included
+ * due to an explicit marker (usually annotation), or just by naming
+ * convention.
+ *
+ * @return True if property was explicitly included (usually by having
+ * one of components being annotated); false if inclusion was purely
+ * due to naming or visibility definitions (that is, implicit)
+ */
+ public abstract boolean isExplicitlyIncluded();
+
/*
/*****************************************************
/* Capabilities
diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java
index 61da205..e9c720d 100644
--- a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java
+++ b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java
@@ -583,7 +583,7 @@
// Otherwise, check ignorals
if (prop.anyIgnorals()) {
// first: if one or more ignorals, and no explicit markers, remove the whole thing
- if (!prop.anyExplicitNames()) {
+ if (!prop.isExplicitlyIncluded()) {
it.remove();
_addIgnored(prop.getName());
continue;
diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java
index 5244eb8..6a783b6 100644
--- a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java
+++ b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java
@@ -107,6 +107,16 @@
@Override
public String getInternalName() { return _internalName; }
+
+ @Override
+ public boolean isExplicitlyIncluded() {
+ return _anyExplicitNames(_fields)
+ || _anyExplicitNames(_getters)
+ || _anyExplicitNames(_setters)
+ || _anyExplicitNames(_ctorParameters)
+ ;
+ }
+
@Override
public boolean hasGetter() { return _getters != null; }
@@ -477,14 +487,6 @@
/**********************************************************
*/
- public boolean anyExplicitNames() {
- return _anyExplicitNames(_fields)
- || _anyExplicitNames(_getters)
- || _anyExplicitNames(_setters)
- || _anyExplicitNames(_ctorParameters)
- ;
- }
-
private <T> boolean _anyExplicitNames(Linked<T> n)
{
for (; n != null; n = n.next) {
diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java b/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java
index f031a22..ff00f65 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java
@@ -632,7 +632,9 @@
Iterator<BeanPropertyDefinition> it = properties.iterator();
while (it.hasNext()) {
BeanPropertyDefinition property = it.next();
- if (!property.couldDeserialize()) {
+ // one caveat: as per [JACKSON-806], only remove implicit properties;
+ // explicitly annotated ones should remain
+ if (!property.couldDeserialize() && !property.isExplicitlyIncluded()) {
it.remove();
}
}
diff --git a/src/main/java/com/fasterxml/jackson/databind/util/SimpleBeanPropertyDefinition.java b/src/main/java/com/fasterxml/jackson/databind/util/SimpleBeanPropertyDefinition.java
index 93c06e2..d5dd92c 100644
--- a/src/main/java/com/fasterxml/jackson/databind/util/SimpleBeanPropertyDefinition.java
+++ b/src/main/java/com/fasterxml/jackson/databind/util/SimpleBeanPropertyDefinition.java
@@ -64,6 +64,10 @@
@Override
public String getInternalName() { return getName(); }
+
+ // hmmh. what should we claim here?
+ @Override
+ public boolean isExplicitlyIncluded() { return false; }
/*
/*****************************************************