Fix #444 for mainline
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java
index 1ba46ac..510805f 100644
--- a/src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java
@@ -15,6 +15,7 @@
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import com.fasterxml.jackson.databind.util.ClassUtil;
@@ -116,15 +117,25 @@
// 04-Feb-2013, tatu: Usually should become null; but not always
return _deserializeFromEmptyString();
}
+ Exception cause = null;
try {
T result = _deserialize(text, ctxt);
if (result != null) {
return result;
}
} catch (IllegalArgumentException iae) {
- // nothing to do here, yet? We'll fail anyway
+ cause = iae;
}
- throw ctxt.weirdStringException(text, _valueClass, "not a valid textual representation");
+ String msg = "not a valid textual representation";
+ if (cause != null) {
+ msg += "problem: "+cause.getMessage();
+ }
+ JsonMappingException e = ctxt.weirdStringException(text, _valueClass, msg);
+ if (cause != null) {
+ e.initCause(cause);
+ }
+ throw e;
+ // nothing to do here, yet? We'll fail anyway
}
if (jp.getCurrentToken() == JsonToken.VALUE_EMBEDDED_OBJECT) {
// Trivial cases; null to null, instance of type itself returned as is
@@ -238,8 +249,7 @@
int i = value.lastIndexOf(']');
if (i == -1) {
- throw new InvalidFormatException(
- "Bracketed IPv6 address must contain closing bracket.",
+ throw new InvalidFormatException("Bracketed IPv6 address must contain closing bracket",
value, InetSocketAddress.class);
}
@@ -247,15 +257,14 @@
int port = j > -1 ? Integer.parseInt(value.substring(j + 1)) : 0;
return new InetSocketAddress(value.substring(0, i + 1), port);
} else {
- int i = value.indexOf(':');
- if (i != -1 && value.indexOf(':', i + 1) == -1) {
+ int ix = value.indexOf(':');
+ if (ix >= 0 && value.indexOf(':', ix + 1) < 0) {
// host:port
- int port = Integer.parseInt(value.substring(i));
- return new InetSocketAddress(value.substring(0, i), port);
- } else {
- // host or unbracketed IPv6, without port number
- return new InetSocketAddress(value, 0);
+ int port = Integer.parseInt(value.substring(ix+1));
+ return new InetSocketAddress(value.substring(0, ix), port);
}
+ // host or unbracketed IPv6, without port number
+ return new InetSocketAddress(value, 0);
}
}
throw new IllegalArgumentException();
diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/TestJdkTypes.java b/src/test/java/com/fasterxml/jackson/databind/deser/TestJdkTypes.java
index 7353a69..ad3305d 100644
--- a/src/test/java/com/fasterxml/jackson/databind/deser/TestJdkTypes.java
+++ b/src/test/java/com/fasterxml/jackson/databind/deser/TestJdkTypes.java
@@ -266,9 +266,14 @@
assertEquals(443, ip6port.getPort());
// should we try resolving host names? That requires connectivity...
- final String HOST = "www.ning.com";
+ final String HOST = "www.google.com";
address = MAPPER.readValue(quote(HOST), InetSocketAddress.class);
assertEquals(HOST, address.getHostName());
+
+ final String HOST_AND_PORT = HOST+":80";
+ address = MAPPER.readValue(quote(HOST_AND_PORT), InetSocketAddress.class);
+ assertEquals(HOST, address.getHostName());
+ assertEquals(80, address.getPort());
}
// [JACKSON-597]