Hi Łukasz!

This problem is caused by *@Cacheable* annotation on
*SampleRepo#getSampleEntity()
*method.
When you invoke it for the first time, its result is put into an Ignite
cache. And for the second time the result is just taken from the cache, you
probably know that.

The problem is that *SampleEntity* contains a *key* field, which internally
uses *SingletonImmutableList* class. This class has *writeReplace()* method,
that alters the serialization. I guess, that lookup for this method was
broken for *BinaryMarshaller* in 2.3 release.

*SingletonImmutableList* has a transient field *element*. When you put this
value into a cache, it is serialized, and value of this field is omitted.
When you get this value from cache, this field is null, which causes the
NPE.

But actually this class should be serialized, using *writeReplace()*
method. It works fine if you change marshaller to Optimized. To do it, add
the following line to *CacheConfig#provideDevIgniteConfiguration():*

cfg.setMarshaller(new OptimizedMarshaller(false));

Note, that Optimized marshaller actually has a number of restrictions.
Features like IgniteCache.withKeepBinary(), .NET, C++, ODBC won't work with
it. It may also affect performance, especially if you use SQL.

I'll investigate this problem further. I hope, it will be fixed by 2.4
release.

Denis

вт, 19 дек. 2017 г. в 0:37, lukaszbyjos <[email protected]>:

> I have created repo for this error to easier recreate.
>
> https://github.com/Mistic92/ignite-bug
>
> When using 2.2.0 everything is ok. But after update to 2.3.0 I get error
>
> Caused by: org.apache.ignite.binary.BinaryObjectException: Failed to read
> field [name=XXXX]
>         at
>
> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:168)
> ~[ignite-core-2.3.0.jar:2.3.0]
>         at
>
> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:843)
> ~[ignite-core-2.3.0.jar:2.3.0]
>         ... 135 more
> Caused by: java.lang.NullPointerException
>         at
> com.google.common.collect.ImmutableList.hashCode(ImmutableList.java:571)
> ~[guava-20.0.jar:?]
>         at java.util.Arrays.hashCode(Arrays.java:4146) ~[?:1.8.0_152]
>         at java.util.Objects.hash(Objects.java:128) ~[?:1.8.0_152]
>         at com.google.cloud.datastore.BaseKey.hashCode(BaseKey.java:204)
> ~[google-cloud-datastore-1.8.0.jar:1.8.0]
>         at
>
> com.jmethods.catatumbo.DefaultDatastoreKey.hashCode(DefaultDatastoreKey.java:134)
> ~[catatumbo-catatumbo-2.4.0.jar:2.4.0]
>         at java.util.HashMap.hash(HashMap.java:339) ~[?:1.8.0_152]
>         at java.util.HashMap.put(HashMap.java:612) ~[?:1.8.0_152]
>         at java.util.HashSet.add(HashSet.java:220) ~[?:1.8.0_152]
>         at
>
> org.apache.ignite.internal.binary.BinaryUtils.doReadCollection(BinaryUtils.java:2093)
> ~[ignite-core-2.3.0.jar:2.3.0]
>         at
>
> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1914)
> ~[ignite-core-2.3.0.jar:2.3.0]
>         at
>
> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1714)
> ~[ignite-core-2.3.0.jar:2.3.0]
>         at
>
> org.apache.ignite.internal.binary.BinaryReaderExImpl.readField(BinaryReaderExImpl.java:1982)
> ~[ignite-core-2.3.0.jar:2.3.0]
>         at
>
> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read0(BinaryFieldAccessor.java:679)
> ~[ignite-core-2.3.0.jar:2.3.0]
>         at
>
> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:164)
> ~[ignite-core-2.3.0.jar:2.3.0]
>         at
>
> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:843)
> ~[ignite-core-2.3.0.jar:2.3.0]
>         ... 135 more
>
>
>
>
> --
> Sent from: http://apache-ignite-users.70518.x6.nabble.com/
>

Reply via email to