Skip to content

NullPointerException at ReflectionUtil.getAllFields() when using custom interface as a variable type #78

Description

@tomazic89

Version used: 1.0.1
Source: maven repo
The bug is in line 97 of ReflectionUtils.java
if (methodSource.getSuperclass() != Object.class) { //recursion stop condition
There should also be null check
if (methodSource.getSuperclass() != Object.class && methodSource.getSuperclass() != null) {

I was trying to play around with PropertyMapping but I think that this is not the case.

I'm adding simple unit test:

package com.xyz.test.entityaudit;

import static org.junit.Assert.assertTrue;

import java.util.List;

import org.javers.core.Javers;
import org.javers.core.JaversBuilder;
import org.javers.core.diff.Diff;
import org.javers.core.diff.changetype.ValueChange;
import org.javers.core.metamodel.annotation.Entity;
import org.javers.core.metamodel.annotation.Id;
import org.junit.Test;

/**
 * @author nejct
 */
public class JaversTest {

    @Test
    public void simpleClassTest() {
        // given
        SimpleTestClass foo = new SimpleTestClass(1l, "Foo", new TestInterfaceImpl("Bar"));
        SimpleTestClass bar = new SimpleTestClass(1l, "Bar", new TestInterfaceImpl("Foo"));

        Javers javers = JaversBuilder.javers().build();

        // when
        Diff diff = javers.compare(foo, bar);

        // then
        assertTrue(diff.getChanges().size() == 2);
        for(ValueChange change : diff.getChangesByType(ValueChange.class)) {
            if (change.getProperty().getName().equals("testInterfaceProperty")) {
                assertTrue(change.getLeft().equals("Bar"));
                assertTrue(change.getRight().equals("Foo"));
            } else if (change.getProperty().getName().equals("stringProperty")) {
                assertTrue(change.getLeft().equals("Foo"));
                assertTrue(change.getRight().equals("Bar"));
            } else {

            }
        }

        System.out.println(diff);
    }

    @Test
    public void classWithInterfaceTest() {
        // given
        TestClassWithInterfaceProperty foo = new TestClassWithInterfaceProperty(1l, "Foo", new TestInterfaceImpl("Bar"));
        TestClassWithInterfaceProperty bar = new TestClassWithInterfaceProperty(1l, "Bar", new TestInterfaceImpl("Foo"));

        Javers javers = JaversBuilder.javers().build();

        // when
        Diff diff = javers.compare(foo, bar);

        // then
        assertTrue(diff.getChanges().size() == 2);
        for(ValueChange change : diff.getChangesByType(ValueChange.class)) {
            if (change.getProperty().getName().equals("testInterfaceProperty")) {
                assertTrue(change.getLeft().equals("Bar"));
                assertTrue(change.getRight().equals("Foo"));
            } else if (change.getProperty().getName().equals("stringProperty")) {
                assertTrue(change.getLeft().equals("Foo"));
                assertTrue(change.getRight().equals("Bar"));
            } else {

            }
        }

        System.out.println(diff);
    }

    @Entity
    public class SimpleTestClass {
        @Id
        private Long id;
        private List<String> list = java.util.Arrays.asList("Foo", "Bar");
        private String stringProperty;
        private TestInterfaceImpl testInterface;

        public SimpleTestClass(Long id, String stringProperty, TestInterfaceImpl testInterface) {
            this.id = id;
            this.stringProperty = stringProperty;
            this.testInterface = testInterface;
        }
    }

    @Entity
    public class TestClassWithInterfaceProperty {
        @Id
        private Long id;
        private List<String> list = java.util.Arrays.asList("Foo", "Bar");
        private String string;
        private TestInterface testInterface;

        public TestClassWithInterfaceProperty(Long id, String string, TestInterfaceImpl testInterface) {
            this.id = id;
            this.string = string;
            this.testInterface = testInterface;
        }
    }

    interface TestInterface {
        String getProperty();
    }

    public class TestInterfaceImpl implements TestInterface {

        private String testInterfaceProperty;

        public TestInterfaceImpl(String testInterfaceProperty) {
            this.testInterfaceProperty = testInterfaceProperty;
        }

        @Override
        public String getProperty() {
            return "Foo";
        }
    }
}

EDIT: added updated test if you want to use it later.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions