Piping view definitions through
diff --git a/src/main/java/com/fasterxml/jackson/databind/BeanPropertyDefinition.java b/src/main/java/com/fasterxml/jackson/databind/BeanPropertyDefinition.java
index 31dbdf6..de126cf 100644
--- a/src/main/java/com/fasterxml/jackson/databind/BeanPropertyDefinition.java
+++ b/src/main/java/com/fasterxml/jackson/databind/BeanPropertyDefinition.java
@@ -42,7 +42,7 @@
public boolean couldSerialize() {
return getAccessor() != null;
}
-
+
public abstract AnnotatedMethod getGetter();
public abstract AnnotatedMethod getSetter();
public abstract AnnotatedField getField();
@@ -61,4 +61,9 @@
* Null if no such member exists.
*/
public abstract AnnotatedMember getMutator();
+
+ /**
+ * Method used to find View-inclusion definitions for the property.
+ */
+ public abstract Class<?>[] getViews();
}
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 080392b..3de38d2 100644
--- a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java
+++ b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java
@@ -233,7 +233,7 @@
/*
/**********************************************************
- /* Overridable internal methods, sorting
+ /* Overridable internal methods, sorting, other stuff
/**********************************************************
*/
@@ -243,16 +243,16 @@
protected void _sortProperties()
{
// Then how about explicit ordering?
- AnnotationIntrospector intr = _config.getAnnotationIntrospector();
+ AnnotationIntrospector intr = _annotationIntrospector;
boolean sort;
- Boolean alpha = intr.findSerializationSortAlphabetically(_classDef);
+ Boolean alpha = (intr == null) ? null : intr.findSerializationSortAlphabetically(_classDef);
if (alpha == null) {
sort = _config.shouldSortPropertiesAlphabetically();
} else {
sort = alpha.booleanValue();
}
- String[] propertyOrder = intr.findSerializationPropertyOrder(_classDef);
+ String[] propertyOrder = (intr == null) ? null : intr.findSerializationPropertyOrder(_classDef);
// no sorting? no need to shuffle, then
if (!sort && (_creatorProperties == null) && (propertyOrder == null)) {
@@ -302,7 +302,7 @@
_properties.clear();
_properties.putAll(ordered);
}
-
+
/*
/**********************************************************
/* Overridable internal methods, adding members
@@ -673,7 +673,8 @@
{
POJOPropertyBuilder prop = _properties.get(implName);
if (prop == null) {
- prop = new POJOPropertyBuilder(implName);
+ prop = new POJOPropertyBuilder(implName, _annotationIntrospector,
+ _forSerialization);
_properties.put(implName, prop);
}
return prop;
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 0b46f0b..2ac3c08 100644
--- a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java
+++ b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java
@@ -1,5 +1,6 @@
package com.fasterxml.jackson.databind.introspect;
+import com.fasterxml.jackson.databind.AnnotationIntrospector;
import com.fasterxml.jackson.databind.BeanPropertyDefinition;
/**
@@ -11,6 +12,14 @@
implements Comparable<POJOPropertyBuilder>
{
/**
+ * Whether property is being composed for serialization
+ * (true) or deserialization (false)
+ */
+ protected final boolean _forSerialization;
+
+ protected final AnnotationIntrospector _annotationIntrospector;
+
+ /**
* External name of logical property; may change with
* renaming (by new instance being constructed using
* a new name)
@@ -30,21 +39,26 @@
protected Node<AnnotatedMethod> _getters;
protected Node<AnnotatedMethod> _setters;
-
- public POJOPropertyBuilder(String internalName)
+
+ public POJOPropertyBuilder(String internalName, AnnotationIntrospector annotationIntrospector,
+ boolean forSerialization)
{
_internalName = internalName;
_name = internalName;
+ _annotationIntrospector = annotationIntrospector;
+ _forSerialization = forSerialization;
}
public POJOPropertyBuilder(POJOPropertyBuilder src, String newName)
{
_internalName = src._internalName;
_name = newName;
+ _annotationIntrospector = src._annotationIntrospector;
_fields = src._fields;
_ctorParameters = src._ctorParameters;
_getters = src._getters;
_setters = src._setters;
+ _forSerialization = src._forSerialization;
}
/**
@@ -104,29 +118,6 @@
public boolean hasConstructorParameter() { return _ctorParameters != null; }
@Override
- public AnnotatedMember getAccessor()
- {
- AnnotatedMember m = getGetter();
- if (m == null) {
- m = getField();
- }
- return m;
- }
-
- @Override
- public AnnotatedMember getMutator()
- {
- AnnotatedMember m = getConstructorParameter();
- if (m == null) {
- m = getSetter();
- if (m == null) {
- m = getField();
- }
- }
- return m;
- }
-
- @Override
public boolean couldSerialize() {
return (_getters != null) || (_fields != null);
}
@@ -247,6 +238,42 @@
return _ctorParameters.value;
}
+ @Override
+ public AnnotatedMember getAccessor()
+ {
+ AnnotatedMember m = getGetter();
+ if (m == null) {
+ m = getField();
+ }
+ return m;
+ }
+
+ @Override
+ public AnnotatedMember getMutator()
+ {
+ AnnotatedMember m = getConstructorParameter();
+ if (m == null) {
+ m = getSetter();
+ if (m == null) {
+ m = getField();
+ }
+ }
+ return m;
+ }
+
+ /**
+ * Method that will try to find JSON View inclusion information
+ * for this property.
+ */
+ public Class<?>[] getViews()
+ {
+ if (_annotationIntrospector != null) {
+ AnnotatedMember m = _forSerialization ? getAccessor() : getMutator();
+ return _annotationIntrospector.findViews(m);
+ }
+ return null;
+ }
+
/*
/**********************************************************
/* Data aggregation
diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/BeanPropertyWriter.java b/src/main/java/com/fasterxml/jackson/databind/ser/BeanPropertyWriter.java
index 3ccf0ff..bca93c6 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ser/BeanPropertyWriter.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ser/BeanPropertyWriter.java
@@ -134,7 +134,7 @@
* Alternate set of property writers used when view-based filtering
* is available for the Bean.
*/
- protected Class<?>[] _includeInViews;
+ protected final Class<?>[] _includeInViews;
/**
* If property being serialized needs type information to be
@@ -159,25 +159,17 @@
/* Construction, configuration
/**********************************************************
*/
-
- public BeanPropertyWriter(AnnotatedMember member, Annotations contextAnnotations,
- String name, JavaType declaredType,
- JsonSerializer<Object> ser, TypeSerializer typeSer, JavaType serType,
- Method m, Field f, boolean suppressNulls, Object suppressableValue)
- {
- this(member, contextAnnotations, new SerializedString(name), declaredType,
- ser, typeSer, serType,
- m, f, suppressNulls, suppressableValue);
- }
- public BeanPropertyWriter(AnnotatedMember member, Annotations contextAnnotations,
- SerializedString name, JavaType declaredType,
+ public BeanPropertyWriter(BeanPropertyDefinition propDef,
+ AnnotatedMember member, Annotations contextAnnotations,
+ JavaType declaredType,
JsonSerializer<Object> ser, TypeSerializer typeSer, JavaType serType,
Method m, Field f, boolean suppressNulls, Object suppressableValue)
{
+
_member = member;
_contextAnnotations = contextAnnotations;
- _name = name;
+ _name = new SerializedString(propDef.getName());
_declaredType = declaredType;
_serializer = ser;
_dynamicSerializers = (ser == null) ? PropertySerializerMap.emptyMap() : null;
@@ -187,6 +179,7 @@
_field = f;
_suppressNulls = suppressNulls;
_suppressableValue = suppressableValue;
+ _includeInViews = propDef.getViews();
// this will be resolved later on, unless nulls are to be suppressed
_nullSerializer = null;
@@ -266,16 +259,6 @@
public BeanPropertyWriter unwrappingWriter(NameTransformer unwrapper) {
return new UnwrappingBeanPropertyWriter(this, unwrapper);
}
-
- /**
- * Method for defining which views to included value of this
- * property in. If left undefined, will always be included;
- * otherwise active view definition will be checked against
- * definition list and value is only included if active
- * view is one of defined views, or its sub-view (as defined
- * by class/sub-class relationship).
- */
- public void setViews(Class<?>[] views) { _includeInViews = views; }
/**
* Method called to define type to consider as "non-trivial" basetype,
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 f7fc7a3..0efc255 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java
@@ -519,7 +519,6 @@
if (properties.isEmpty()) {
return null;
}
-
// null is for value type serializer, which we don't have access to from here (ditto for bean prop)
boolean staticTyping = usesStaticTyping(config, beanDesc, null, null);
PropertyBuilder pb = constructPropertyBuilder(config, beanDesc);
@@ -534,11 +533,10 @@
if (prop != null && prop.isBackReference()) {
continue;
}
- String name = property.getName();
if (accessor instanceof AnnotatedMethod) {
- result.add(_constructWriter(prov, typeBind, pb, staticTyping, name, (AnnotatedMethod) accessor));
+ result.add(_constructWriter(property, prov, typeBind, pb, staticTyping, (AnnotatedMethod) accessor));
} else {
- result.add(_constructWriter(prov, typeBind, pb, staticTyping, name, (AnnotatedField) accessor));
+ result.add(_constructWriter(property, prov, typeBind, pb, staticTyping, (AnnotatedField) accessor));
}
}
return result;
@@ -671,11 +669,12 @@
* Secondary helper method for constructing {@link BeanPropertyWriter} for
* given member (field or method).
*/
- protected BeanPropertyWriter _constructWriter(SerializerProvider prov,
- TypeBindings typeContext,
- PropertyBuilder pb, boolean staticTyping, String name, AnnotatedMember accessor)
+ protected BeanPropertyWriter _constructWriter(BeanPropertyDefinition propDef,
+ SerializerProvider prov, TypeBindings typeContext,
+ PropertyBuilder pb, boolean staticTyping, AnnotatedMember accessor)
throws JsonMappingException
{
+ final String name = propDef.getName();
if (prov.canOverrideAccessModifiers()) {
accessor.fixAccess();
}
@@ -692,11 +691,8 @@
// and if not JAXB collection/array with annotations, maybe regular type info?
TypeSerializer typeSer = findPropertyTypeSerializer(type, prov.getConfig(), accessor, property);
- BeanPropertyWriter pbw = pb.buildWriter(name, type, annotatedSerializer,
+ BeanPropertyWriter pbw = pb.buildWriter(propDef, type, annotatedSerializer,
typeSer, contentTypeSer, accessor, staticTyping);
- // how about views? (1.4+)
- AnnotationIntrospector intr = prov.getAnnotationIntrospector();
- pbw.setViews(intr.findViews(accessor));
return pbw;
}
}
diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/PropertyBuilder.java b/src/main/java/com/fasterxml/jackson/databind/ser/PropertyBuilder.java
index e7b3842..da14f26 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ser/PropertyBuilder.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ser/PropertyBuilder.java
@@ -55,7 +55,8 @@
* to use for contained values (only used for properties that are
* of container type)
*/
- protected BeanPropertyWriter buildWriter(String name, JavaType declaredType,
+ protected BeanPropertyWriter buildWriter(BeanPropertyDefinition propDef,
+ JavaType declaredType,
JsonSerializer<Object> ser,
TypeSerializer typeSer, TypeSerializer contentTypeSer,
AnnotatedMember am, boolean defaultUseStaticTyping)
@@ -90,7 +91,7 @@
*/
if (ct == null) {
throw new IllegalStateException("Problem trying to create BeanPropertyWriter for property '"
- +name+"' (of type "+_beanDesc.getType()+"); serialization type "+serializationType+" has no content");
+ +propDef.getName()+"' (of type "+_beanDesc.getType()+"); serialization type "+serializationType+" has no content");
}
serializationType = serializationType.withContentTypeHandler(contentTypeSer);
ct = serializationType.getContentType();
@@ -104,7 +105,7 @@
if (methodProps != null) {
switch (methodProps) {
case NON_DEFAULT:
- valueToSuppress = getDefaultValue(name, m, f);
+ valueToSuppress = getDefaultValue(propDef.getName(), m, f);
if (valueToSuppress == null) {
suppressNulls = true;
} else {
@@ -133,7 +134,8 @@
}
}
- BeanPropertyWriter bpw = new BeanPropertyWriter(am, _beanDesc.getClassAnnotations(), name, declaredType,
+ BeanPropertyWriter bpw = new BeanPropertyWriter(propDef,
+ am, _beanDesc.getClassAnnotations(), declaredType,
ser, typeSer, serializationType, m, f, suppressNulls, valueToSuppress);
// [JACKSON-132]: Unwrapping
diff --git a/src/test/java/com/fasterxml/jackson/databind/ser/TestBeanSerializer.java b/src/test/java/com/fasterxml/jackson/databind/ser/TestBeanSerializer.java
index 1cf41b1..95ae875 100644
--- a/src/test/java/com/fasterxml/jackson/databind/ser/TestBeanSerializer.java
+++ b/src/test/java/com/fasterxml/jackson/databind/ser/TestBeanSerializer.java
@@ -7,6 +7,7 @@
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializer;
@@ -156,14 +157,15 @@
BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties)
{
JavaType strType = config.constructType(String.class);
+ // we need a valid BeanPropertyDefinition; this will do (just need name to match)
+ POJOPropertyBuilder prop = new POJOPropertyBuilder("bogus", null, true);
try {
- beanProperties.add(new BeanPropertyWriter(
+ beanProperties.add(new BeanPropertyWriter(prop,
null, null,
- "bogus", strType,
+ strType,
null, null, strType,
null, EmptyBean.class.getDeclaredField("name"),
- false, null
- ));
+ false, null));
} catch (NoSuchFieldException e) {
throw new IllegalStateException(e.getMessage());
}