Skip to content

Commit eb3f592

Browse files
committed
Post-merge cleanup wrt #4253 NPE checks
1 parent f268a0e commit eb3f592

File tree

1 file changed

+90
-5
lines changed

1 file changed

+90
-5
lines changed

src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java

Lines changed: 90 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ protected T _deserializeFromString(JsonParser p, DeserializationContext ctxt)
290290
if (inst.canCreateFromLong()) {
291291
if (ctxt.findCoercionAction(LogicalType.Integer, Long.class,
292292
CoercionInputShape.String) == CoercionAction.TryConvert) {
293-
return (T) inst.createFromLong(ctxt, _parseLongPrimitive(ctxt, value));
293+
return (T) inst.createFromLong(ctxt, _parseLongPrimitive(p, ctxt, value));
294294
}
295295
}
296296
if (inst.canCreateFromBoolean()) {
@@ -773,12 +773,39 @@ protected final int _parseIntPrimitive(JsonParser p, DeserializationContext ctxt
773773
_verifyNullForPrimitiveCoercion(ctxt, text);
774774
return 0;
775775
}
776-
return _parseIntPrimitive(ctxt, text);
776+
return _parseIntPrimitive(p, ctxt, text);
777+
}
778+
779+
/**
780+
* @since 2.20
781+
*/
782+
protected int _parseIntPrimitive(JsonParser p, DeserializationContext ctxt,
783+
String text) throws IOException
784+
{
785+
try {
786+
if (text.length() > 9) {
787+
p.streamReadConstraints().validateIntegerLength(text.length());
788+
long l = NumberInput.parseLong(text);
789+
if (_intOverflow(l)) {
790+
Number v = (Number) ctxt.handleWeirdStringValue(Integer.TYPE, text,
791+
"Overflow: numeric value (%s) out of range of int (%d -%d)",
792+
text, Integer.MIN_VALUE, Integer.MAX_VALUE);
793+
return _nonNullNumber(v).intValue();
794+
}
795+
return (int) l;
796+
}
797+
return NumberInput.parseInt(text);
798+
} catch (IllegalArgumentException iae) {
799+
Number v = (Number) ctxt.handleWeirdStringValue(Integer.TYPE, text,
800+
"not a valid `int` value");
801+
return _nonNullNumber(v).intValue();
802+
}
777803
}
778804

779805
/**
780806
* @since 2.9
781807
*/
808+
@Deprecated // since 2.20, use method variant that takes JsonParser
782809
protected final int _parseIntPrimitive(DeserializationContext ctxt, String text) throws IOException
783810
{
784811
try {
@@ -851,12 +878,37 @@ protected final Integer _parseInteger(JsonParser p, DeserializationContext ctxt,
851878
if (_checkTextualNull(ctxt, text)) {
852879
return (Integer) getNullValue(ctxt);
853880
}
854-
return _parseInteger(ctxt, text);
881+
return _parseInteger(p, ctxt, text);
882+
}
883+
884+
/**
885+
* @since 2.20
886+
*/
887+
protected Integer _parseInteger(JsonParser p, DeserializationContext ctxt,
888+
String text) throws IOException
889+
{
890+
try {
891+
if (text.length() > 9) {
892+
p.streamReadConstraints().validateIntegerLength(text.length());
893+
long l = NumberInput.parseLong(text);
894+
if (_intOverflow(l)) {
895+
return (Integer) ctxt.handleWeirdStringValue(Integer.class, text,
896+
"Overflow: numeric value (%s) out of range of `java.lang.Integer` (%d -%d)",
897+
text, Integer.MIN_VALUE, Integer.MAX_VALUE);
898+
}
899+
return Integer.valueOf((int) l);
900+
}
901+
return NumberInput.parseInt(text);
902+
} catch (IllegalArgumentException iae) {
903+
return(Integer) ctxt.handleWeirdStringValue(Integer.class, text,
904+
"not a valid `java.lang.Integer` value");
905+
}
855906
}
856907

857908
/**
858909
* @since 2.14
859910
*/
911+
@Deprecated // since 2.20, use method variant that takes JsonParser
860912
protected final Integer _parseInteger(DeserializationContext ctxt, String text) throws IOException
861913
{
862914
try {
@@ -936,12 +988,30 @@ protected final long _parseLongPrimitive(JsonParser p, DeserializationContext ct
936988
_verifyNullForPrimitiveCoercion(ctxt, text);
937989
return 0L;
938990
}
939-
return _parseLongPrimitive(ctxt, text);
991+
return _parseLongPrimitive(p, ctxt, text);
992+
}
993+
994+
/**
995+
* @since 2.20
996+
*/
997+
protected long _parseLongPrimitive(JsonParser p, DeserializationContext ctxt,
998+
String text) throws IOException
999+
{
1000+
p.streamReadConstraints().validateIntegerLength(text.length());
1001+
try {
1002+
return NumberInput.parseLong(text);
1003+
} catch (IllegalArgumentException iae) { }
1004+
{
1005+
Number v = (Number) ctxt.handleWeirdStringValue(Long.TYPE, text,
1006+
"not a valid `long` value");
1007+
return _nonNullNumber(v).longValue();
1008+
}
9401009
}
9411010

9421011
/**
9431012
* @since 2.9
9441013
*/
1014+
@Deprecated // since 2.20, use method variant that takes JsonParser
9451015
protected final long _parseLongPrimitive(DeserializationContext ctxt, String text) throws IOException
9461016
{
9471017
_streamReadConstraints(ctxt).validateIntegerLength(text.length());
@@ -1006,12 +1076,27 @@ protected final Long _parseLong(JsonParser p, DeserializationContext ctxt,
10061076
return (Long) getNullValue(ctxt);
10071077
}
10081078
// let's allow Strings to be converted too
1009-
return _parseLong(ctxt, text);
1079+
return _parseLong(p, ctxt, text);
1080+
}
1081+
1082+
/**
1083+
* @since 2.20
1084+
*/
1085+
protected Long _parseLong(JsonParser p, DeserializationContext ctxt,
1086+
String text) throws IOException
1087+
{
1088+
p.streamReadConstraints().validateIntegerLength(text.length());
1089+
try {
1090+
return NumberInput.parseLong(text);
1091+
} catch (IllegalArgumentException iae) { }
1092+
return (Long) ctxt.handleWeirdStringValue(Long.class, text,
1093+
"not a valid `java.lang.Long` value");
10101094
}
10111095

10121096
/**
10131097
* @since 2.14
10141098
*/
1099+
@Deprecated // since 2.20, use method variant that takes JsonParser
10151100
protected final Long _parseLong(DeserializationContext ctxt, String text) throws IOException
10161101
{
10171102
_streamReadConstraints(ctxt).validateIntegerLength(text.length());

0 commit comments

Comments
 (0)