From 07141ee8391ea9ce36a8e1b9774e0b391172e2df Mon Sep 17 00:00:00 2001 From: Domingo Galdos Date: Thu, 30 Apr 2015 18:10:29 -0400 Subject: [PATCH] allow missing build method if its name is empty "" This allows builder-like objects whose class is its own builder class, no need to convert later from the Builder type to the "real" type with a final build() This works well for the immutable classes Project Lombok will give you if you use @Wither --- .../jackson/databind/deser/BeanDeserializerBuilder.java | 6 +++++- .../jackson/databind/deser/BuilderBasedDeserializer.java | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBuilder.java b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBuilder.java index ff25acc7ad..1cb7438513 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBuilder.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBuilder.java @@ -368,10 +368,13 @@ public JsonDeserializer buildBuilderBased(JavaType valueType, String expBuildMethodName) { // First: validation; must have build method that returns compatible type - if (_buildMethod == null) { + // ("" means you don't need a build method, just cast the last builder) + if (_buildMethod == null && !"".equals(expBuildMethodName)) { throw new IllegalArgumentException("Builder class "+_beanDesc.getBeanClass().getName() +" does not have build method '"+expBuildMethodName+"()'"); } + + if(_buildMethod != null) { // also: type of the method must be compatible Class rawBuildType = _buildMethod.getRawReturnType(); Class rawValueType = valueType.getRawClass(); @@ -382,6 +385,7 @@ public JsonDeserializer buildBuilderBased(JavaType valueType, +" has bad return type ("+rawBuildType.getName() +"), not compatible with POJO type ("+valueType.getRawClass().getName()+")"); } + } // And if so, we can try building the deserializer Collection props = _properties.values(); BeanPropertyMap propertyMap = BeanPropertyMap.construct(props, _caseInsensitivePropertyComparison); diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java index fd5e5ddf3e..fb3e9351be 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java @@ -117,6 +117,7 @@ protected BeanAsArrayBuilderDeserializer asArrayDeserializer() { protected final Object finishBuild(DeserializationContext ctxt, Object builder) throws IOException { + if(null==_buildMethod) return builder; try { return _buildMethod.getMember().invoke(builder); } catch (Exception e) {