Commit 0b67d4f
committed
Fixed NullPointerException with IBM SDK 8
The steps to replicate the issue are pretty simple:
1. create a new Maven project (e.g. `ibm-jdk-bug`);
2. add as a dependency `yacl4j-core`, version `0.9.1`;
3. in the same project, create a main class (e.g. `Main.java`) as follows:
```java
import com.yacl4j.core.ConfigurationBuilder;
import yacl4j.repackaged.com.fasterxml.jackson.databind.JsonNode;
public class Main {
public static void main(String[] args) {
JsonNode jsonNode = ConfigurationBuilder.newBuilder()
.source().fromFileOnClasspath("config.yaml")
.build(JsonNode.class);
System.out.println(jsonNode);
}
}
```
4. from command line, run the following Docker command:
```docker
docker run -it --rm --name ibm-jdk-bug -v "$PWD":/ibm-jdk-bug ibmcom/ibmjava:8-sdk /bin/bash -c 'cd ibm-jdk-bug && ./mvnw exec:java -Dexec.mainClass="Main"'
```
5. wait for the unbelievable exception to blow on your face:
```java
java.lang.NullPointerException
at com.yacl4j.core.util.ConfigurationUtils.emptyConfiguration(ConfigurationUtils.java:33)
at com.yacl4j.core.ConfigurationBuilder.mergeConfigurationSources(ConfigurationBuilder.java:73)
at com.yacl4j.core.ConfigurationBuilder.build(ConfigurationBuilder.java:64)
at Main.main(Main.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:90)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
at java.lang.reflect.Method.invoke(Method.java:508)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:282)
at java.lang.Thread.run(Thread.java:785)
```
This is the incriminated yacl4j code:
```java
public class ConfigurationUtils {
private ConfigurationUtils() { }
private static final ObjectMapper DEFAULT_OBJECT_MAPPER = Yaml.YAML_OBJECT_MAPPER;
private static ObjectMapper objectMapper(JsonFactory jsonFactory) {
return new ObjectMapper(jsonFactory)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
public static JsonNode emptyConfiguration() {
return DEFAULT_OBJECT_MAPPER.createObjectNode();
}
// ...
public static class Yaml {
private Yaml() { }
private static final ObjectMapper YAML_OBJECT_MAPPER = objectMapper(new YAMLFactory());
// ...
}
// ...
}
```
For some reason I can't really explain, with the IBM SDK 8, the static variable
`DEFAULT_OBJECT_MAPPER` is null! The same works perfectly with Oracle JDK and OpenJDK.1 parent 3167cdb commit 0b67d4f
1 file changed
Lines changed: 9 additions & 7 deletions
Lines changed: 9 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
24 | 26 | | |
25 | | - | |
| 27 | + | |
26 | 28 | | |
27 | 29 | | |
28 | 30 | | |
29 | 31 | | |
30 | 32 | | |
31 | 33 | | |
32 | 34 | | |
33 | | - | |
| 35 | + | |
34 | 36 | | |
35 | 37 | | |
36 | 38 | | |
37 | 39 | | |
38 | | - | |
| 40 | + | |
39 | 41 | | |
40 | 42 | | |
41 | 43 | | |
42 | 44 | | |
43 | 45 | | |
44 | 46 | | |
45 | 47 | | |
46 | | - | |
| 48 | + | |
47 | 49 | | |
48 | 50 | | |
49 | 51 | | |
| |||
70 | 72 | | |
71 | 73 | | |
72 | 74 | | |
73 | | - | |
| 75 | + | |
74 | 76 | | |
75 | 77 | | |
76 | 78 | | |
| |||
98 | 100 | | |
99 | 101 | | |
100 | 102 | | |
101 | | - | |
| 103 | + | |
102 | 104 | | |
103 | 105 | | |
104 | 106 | | |
| |||
0 commit comments