Skip to content

Commit

Permalink
noticket: FIX: NPE could occur during a few first calls to `StringVal…
Browse files Browse the repository at this point in the history
…ueConverter`

```
Caused by: java.lang.NullPointerException: Cannot invoke "java.util.function.Function.apply(Object)" because "f" is null
	at tech.ydb.yoj.databind.converter.StringValueConverter.toJava(StringValueConverter.java:57) ~[processed_yoj-databind-2.6.5.jar!/:?]
	at tech.ydb.yoj.databind.converter.StringValueConverter.toJava(StringValueConverter.java:29) ~[processed_yoj-databind-2.6.5.jar!/:?]
	at tech.ydb.yoj.databind.schema.CustomValueTypeInfo.toJava(CustomValueTypeInfo.java:20) ~[processed_yoj-databind-2.6.5.jar!/:?]
	at tech.ydb.yoj.databind.CustomValueTypes.postconvert(CustomValueTypes.java:54) ~[processed_yoj-databind-2.6.5.jar!/:?]
	at tech.ydb.yoj.repository.ydb.yql.YqlPrimitiveType.lambda$of$72(YqlPrimitiveType.java:492) ~[processed_yoj-repository-ydb-v2-2.6.5.jar!/:?]
	at tech.ydb.yoj.repository.ydb.yql.YqlPrimitiveType.fromYql(YqlPrimitiveType.java:623) ~[processed_yoj-repository-ydb-v2-2.6.5.jar!/:?]
	... 154 more
```
  • Loading branch information
nvamelichev committed Jan 20, 2025
1 parent 897e1ae commit 7a6a38f
Showing 1 changed file with 6 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.function.Function;

import static java.lang.String.format;
Expand All @@ -27,7 +29,7 @@
* @param <J> Java type
*/
public final class StringValueConverter<J> implements ValueConverter<J, String> {
private volatile Function<String, J> deserializer;
private final ConcurrentMap<Class<?>, Function<String, J>> deserializers = new ConcurrentHashMap<>(1);

public StringValueConverter() {
}
Expand All @@ -45,16 +47,9 @@ public StringValueConverter() {
return (J) column;
}

var f = deserializer;
if (deserializer == null) {
synchronized (this) {
f = deserializer;
if (f == null) {
deserializer = f = getStringValueDeserializerMethod(clazz);
}
}
}
return f.apply(column);
return deserializers
.computeIfAbsent(clazz, StringValueConverter::getStringValueDeserializerMethod)
.apply(column);
}

@SuppressWarnings("unchecked")
Expand Down

0 comments on commit 7a6a38f

Please sign in to comment.