/** * Method called to handle a direct self-reference through this property. * Method can choose to indicate an error by throwing * {@link JsonMappingException}; fully handle serialization (and return * true); or indicate that it should be serialized normally (return false). * <p> * Default implementation will throw {@link JsonMappingException} if * {@link SerializationFeature#FAIL_ON_SELF_REFERENCES} is enabled; or * return <code>false</code> if it is disabled. * * @return True if method fully handled self-referential value; false if not * (caller is to handle it) or {@link JsonMappingException} if there * is no way handle it */ protected boolean _handleSelfReference(Object bean, JsonGenerator gen, SerializerProvider prov, JsonSerializer<?> ser) throws JsonMappingException { if (prov.isEnabled(SerializationFeature.FAIL_ON_SELF_REFERENCES) && !ser.usesObjectId()) { // 05-Feb-2013, tatu: Usually a problem, but NOT if we are handling // object id; this may be the case for BeanSerializers at least. // 13-Feb-2014, tatu: another possible ok case: custom serializer // (something // OTHER than {@link BeanSerializerBase} if (ser instanceof BeanSerializerBase) { prov.reportBadDefinition(getType(), "Direct self-reference leading to cycle"); } } return false; }
JavaType idType = idProp.getType(); gen = new PropertyBasedObjectIdGenerator(objectIdInfo, idProp);
idType = idProp.getType(); gen = new PropertyBasedObjectIdGenerator(objectIdInfo, idProp); oiw = ObjectIdWriter.construct(idType, (PropertyName) null, gen, objectIdInfo.getAlwaysAsId());
@Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { for (int i = 0; i < beanProperties.size(); ++i) { final BeanPropertyWriter writer = beanProperties.get(i); if (Optional.class.isAssignableFrom(writer.getType().getRawClass())) { beanProperties.set(i, new GuavaOptionalBeanPropertyWriter(writer)); } } return beanProperties; } }
type = prop.getType(); if (!type.isFinal()) { if (type.isContainerType() || type.containedTypeCount() > 0) {
private boolean isReadable(BeanDescription beanDesc, BeanPropertyWriter writer) { Class<?> parentType = beanDesc.getType().getRawClass(); Class<?> type = writer.getType().getRawClass(); AnnotatedMethod setter = findSetter(beanDesc, writer); // If there's a setter, we assume it's OK to report on the value, // similarly, if there's no setter but the package names match, we assume // that its a nested class used solely for binding to config props, so it // should be kosher. Lists and Maps are also auto-detected by default since // that's what the metadata generator does. This filter is not used if there // is JSON metadata for the property, so it's mainly for user-defined beans. return (setter != null) || ClassUtils.getPackageName(parentType) .equals(ClassUtils.getPackageName(type)) || Map.class.isAssignableFrom(type) || Collection.class.isAssignableFrom(type); }
private AnnotatedMethod findSetter(BeanDescription beanDesc, BeanPropertyWriter writer) { String name = "set" + determineAccessorSuffix(writer.getName()); Class<?> type = writer.getType().getRawClass(); AnnotatedMethod setter = beanDesc.findMethod(name, new Class<?>[] { type }); // The enabled property of endpoints returns a boolean primitive but is set // using a Boolean class if (setter == null && type.equals(Boolean.TYPE)) { setter = beanDesc.findMethod(name, new Class<?>[] { Boolean.class }); } return setter; }
private static List<BeanPropertyWriter> getEmbeddableProperties(List<BeanPropertyWriter> properties) { final List<BeanPropertyWriter> embeddableProperties = new ArrayList<>(); for (BeanPropertyWriter property : properties) { final JavaType type = property.getType(); if (type.isTypeOrSubTypeOf(Embeddable.class)) { embeddableProperties.add(property); } } return embeddableProperties; } }
public static boolean shouldAddExtraProperty(BeanPropertyWriter writer) { return shouldAddExtraProperty(writer.getType()); }
public static boolean shouldAddExtraProperty(BeanPropertyWriter writer) { return shouldAddExtraProperty(writer.getType()); }
private static boolean isLinkType(BeanPropertyWriter property) { final JavaType type = property.getType(); if (JavaTypes.LINK.equals(type)) { return true; } else if (JavaTypes.isIterableLinkType(type)) { return false; } else { throw new IllegalArgumentException( String.format("BeanPropertyWriter must refer to a type of: %s or an Iterable thereof", Link.class)); } } }
private static boolean isCurieType(final BeanPropertyWriter property) { final JavaType type = property.getType(); if (JavaTypes.CURIE.equals(type)) { return true; } else if (JavaTypes.isIterableCurieType(type)) { return false; } else { throw new IllegalArgumentException( String.format("BeanPropertyWriter must refer to a type of: %s or an Iterable thereof", Curie.class)); } }
private static List<BeanPropertyWriter> getLinkProperties(List<BeanPropertyWriter> properties) { final List<BeanPropertyWriter> linkProperties = new ArrayList<>(); for (BeanPropertyWriter property : properties) { final JavaType type = property.getType(); if (JavaTypes.LINK.equals(type) || JavaTypes.isIterableLinkType(type)) { linkProperties.add(property); } } return linkProperties; }
private static List<BeanPropertyWriter> getCurieProperties(List<BeanPropertyWriter> properties) { final List<BeanPropertyWriter> curieProperties = new ArrayList<>(); for (BeanPropertyWriter property : properties) { final JavaType type = property.getType(); if (JavaTypes.CURIE.equals(type) || JavaTypes.isIterableCurieType(type)) { curieProperties.add(property); } } return curieProperties; }
@Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { for (int i = 0; i < beanProperties.size(); ++i) { final BeanPropertyWriter writer = beanProperties.get(i); if (Optional.class.isAssignableFrom(writer.getType().getRawClass())) { beanProperties.set(i, new GuavaOptionalBeanPropertyWriter(writer)); } } return beanProperties; } }
public static ExtraBeanPropertyWriter newWriter(BeanPropertyWriter base) { LOG.trace("Creating new instance"); JavaType initialJavaType = base.getType(); LOG.trace("Initial java type: {}", initialJavaType); final JsonSerializer serializer; if (initialJavaType.getClass().isAssignableFrom(CollectionType.class)) { serializer = new ExtraPropertyStringListSerializer(); } else { serializer = new ExtraPropertyStringSerializer(); } ExtraBeanPropertyWriter writer = new ExtraBeanPropertyWriter(base); writer.assignSerializer(serializer); return writer; }
public static ExtraBeanPropertyWriter newWriter(BeanPropertyWriter base) { LOG.trace("Creating new instance"); JavaType initialJavaType = base.getType(); LOG.trace("Initial java type: {}", initialJavaType); final JsonSerializer serializer; if (initialJavaType.getClass().isAssignableFrom(CollectionType.class)) { serializer = new ExtraPropertyStringListSerializer(); } else { serializer = new ExtraPropertyStringSerializer(); } ExtraBeanPropertyWriter writer = new ExtraBeanPropertyWriter(base); writer.assignSerializer(serializer); return writer; }
@Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { for (BeanPropertyWriter writer : beanProperties) { writer.assignNullSerializer(new NullAsEmptySerializer(writer.getType().getRawClass())); } return beanProperties; }
@Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { for (BeanPropertyWriter writer : beanProperties) { Class<?> rawClass = writer.getType().getRawClass(); if (!writer.hasNullSerializer()) { writer.assignNullSerializer(new StdSerializer<Object>(Object.class) { private static final long serialVersionUID = -3272802392550287442L; @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException { NullAsEmptySerializer.serializeNull(gen, rawClass, value); } }); } } return beanProperties; }