Mvel перебрать список

У меня есть эта иерархия классов

Класс учащихся .java

public class StudentClass {

    private List<Student> studentList;

    public List<Student> getStudentList() {
        return studentList;
    }

    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }
}

Студент.java

public class Student {

    private Child child;

    private int   studAge;

    public Student(Child child, int studAge) {
        this.child = child;
        this.studAge = studAge;
    }

    public Child getChild() {
        return child;
    }

    public void setChild(Child child) {
        this.child = child;
    }

    public int getStudAge() {
        return studAge;
    }

    public void setStudAge(int studAge) {
        this.studAge = studAge;
    }

}

Child.java

public class Child {

    private String name;

    private int    age;

    public Child(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

Основной класс

По некоторой логике я создаю это выражение для выполнения через MVEL. Этот фрагмент кода отлично работает, когда child2 равен нулю, но когда child1 равен нулю, он выдает следующую ошибку. Это допустимый сценарий, и это просто копия моих сущностей из моего приложения. Дочерний элемент может быть нулевым внутри Родителя.

Проблема возникает только тогда, когда объект имеет значение null в индексе 0 , остальные индексы работают нормально, даже если в индексе 1 он равен нулю, а индекс 0 не выполняется, если условие, тогда он будет выполняться в индексе 2

public class MvelTest {

    public static void main(String args[]) throws Exception {
        String s = "if(contextObjectStudentClass.?studentList != null ){ foreach ( loopVariable0 : contextObjectStudentClass.?studentList){if ( loopVariable0.?child.?age==21 ){return  loopVariable0.?child.?name ;}}}return null ;";

        Child child2 = new Child("ankur", 23);
        Child child1 = null;
        Child child3 = new Child("ankurs", 21);

        Student s1 = new Student(child1, 21);
        Student s2 = new Student(child2, 23);
        Student s3 = new Student(child3, 27);

        List<Student> studentList = new ArrayList<Student>();
        studentList.add(s1);
        studentList.add(s2);
        studentList.add(s3);

        StudentClass class1 = new StudentClass();
        class1.setStudentList(studentList);

        Map map = new HashMap();
        map.put("contextObjectStudentClass", class1);

        System.out.println(MVEL.eval(s, map));

    }
}

Исключение

Exception in thread "main" java.lang.RuntimeException: cannot invoke getter: getChild (see trace)
    at org.mvel2.optimizers.impl.refl.nodes.GetterAccessor.getValue(GetterAccessor.java:70)
    at org.mvel2.optimizers.impl.refl.nodes.VariableAccessor.getValue(VariableAccessor.java:37)
    at org.mvel2.optimizers.dynamic.DynamicGetAccessor.getValue(DynamicGetAccessor.java:73)
    at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:108)
    at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:114)
    at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:38)
    at org.mvel2.ast.IfNode.getReducedValueAccelerated(IfNode.java:73)
    at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:38)
    at org.mvel2.ast.ForEachNode.getReducedValue(ForEachNode.java:136)
    at org.mvel2.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:106)
    at org.mvel2.MVELInterpretedRuntime.parse(MVELInterpretedRuntime.java:49)
    at org.mvel2.MVEL.eval(MVEL.java:408)
    at org.mvel2.ast.IfNode.getReducedValue(IfNode.java:89)
    at org.mvel2.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:106)
    at org.mvel2.MVELInterpretedRuntime.parse(MVELInterpretedRuntime.java:49)
    at org.mvel2.MVEL.eval(MVEL.java:165)
    at com.nucleus.rules.service.MvelTest.main(MvelTest.java:34)
Caused by: java.lang.NullPointerException
    at org.mvel2.optimizers.impl.refl.nodes.NullSafe$1.getValue(NullSafe.java:39)
    at org.mvel2.optimizers.impl.refl.nodes.NullSafe.getValue(NullSafe.java:54)
    at org.mvel2.optimizers.impl.refl.nodes.GetterAccessor.getValue(GetterAccessor.java:40)
    ... 16 more

person Ankur Singhal    schedule 10.11.2014    source источник
comment
Исключение странное, поскольку оно, похоже, не ссылается на то, что, как я думаю, будет, но вы делаете loopVariable0.?child.?age, который будет вызываться, даже если дочерний элемент имеет значение null, что вызовет этот NPE.   -  person mkobit    schedule 10.11.2014
comment
@MikeKobit да, но каким-то образом он удерживает первый элемент в каком-то узле и сравнивает, может быть. поскольку добавление нулевого объекта во 2-й индекс внутри списка не вызывает никаких проблем, даже если первый элемент не соответствует критериям, выполняется 3-й элемент.   -  person Ankur Singhal    schedule 10.11.2014
comment
Подскажите, пожалуйста, номер версии Mvel.   -  person Siva Kumar    schedule 12.12.2014


Ответы (1)


У меня работает в версии 2.0. Я пробовал даже ноль во 2 или 3 позиции, его исключение исключения

Я прикрепил исключение

    Exception in thread "main" [Error: cannot invoke getter: getChild [declr.class: Student; act.class: Student]]
[Near : {... ame ;}}} else { return "Noo" } ....}]
[Line: 1, Column: 218]
    at org.mvel.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:156)
    at org.mvel.MVELInterpretedRuntime.parse(MVELInterpretedRuntime.java:54)
    at org.mvel.MVEL.eval(MVEL.java:124)
    at MvelTest.main(MvelTest.java:33)
Caused by: [Error: cannot invoke getter: getChild [declr.class: Student; act.class: Student]]
[Near : {... loopVariable0.?child.?name ;} ....}]
[Line: 1, Column: 143]
    at org.mvel.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:156)
    at org.mvel.MVELInterpretedRuntime.parse(MVELInterpretedRuntime.java:54)
    at org.mvel.MVEL.eval(MVEL.java:107)
    at org.mvel.ast.IfNode.getReducedValue(IfNode.java:64)
    at org.mvel.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:106)
    ... 3 more
Caused by: [Error: cannot invoke getter: getChild [declr.class: Student; act.class: Student]]
[Near : {... Unknown ....}]
    at org.mvel.optimizers.impl.refl.GetterAccessor.getValue(GetterAccessor.java:51)
    at org.mvel.optimizers.impl.refl.VariableAccessor.getValue(VariableAccessor.java:38)
    at org.mvel.optimizers.dynamic.DynamicGetAccessor.getValue(DynamicGetAccessor.java:44)
    at org.mvel.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:97)
    at org.mvel.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:64)
    at org.mvel.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:46)
    at org.mvel.ast.IfNode.getReducedValueAccelerated(IfNode.java:48)
    at org.mvel.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:46)
    at org.mvel.ast.ForEachNode.getReducedValue(ForEachNode.java:148)
    at org.mvel.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:106)
    ... 7 more
Caused by: [Error: cannot invoke getter: getAge [declr.class: Child; act.class: null]]
[Near : {... Unknown ....}]
    at org.mvel.optimizers.impl.refl.GetterAccessor.getValue(GetterAccessor.java:51)
    at org.mvel.optimizers.impl.refl.GetterAccessor.getValue(GetterAccessor.java:38)
    ... 16 more
Caused by: java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.mvel.optimizers.impl.refl.GetterAccessor.getValue(GetterAccessor.java:41)
    ... 17 more
person Siva Kumar    schedule 11.12.2014
comment
я использую 2.2.0.Final - person Ankur Singhal; 12.12.2014
comment
@Mike Brock нужны ваши комментарии, если ошибка в MVEL, как я могу сообщить. - person Ankur Singhal; 12.12.2014
comment
@tobias_k нужны ваши комментарии, если ошибка в MVEL, как я могу сообщить. - person Ankur Singhal; 12.12.2014
comment
@Florent Guillaume нужны ваши комментарии, если ошибка в MVEL, как я могу сообщить. - person Ankur Singhal; 12.12.2014
comment
@ankur-singhal Пожалуйста, попробуйте 2.0 . Это ошибка Mvel. - person Siva Kumar; 12.12.2014
comment
у вас также возникает такая же проблема с объектом как с нулевым значением для любого индекса, верно..?? - person Ankur Singhal; 12.12.2014
comment
то переход на предыдущую версию мне тоже не поможет правильно,??? также как мы можем сообщить об ошибке в MVEL. - person Ankur Singhal; 12.12.2014
comment
@ankur-singhal Я пробовал в 2.0, у меня работает. Может быть, они представили какую-то новую функцию, которую только вы пропустите - person Siva Kumar; 12.12.2014
comment
Давайте продолжим обсуждение в чате. - person Ankur Singhal; 12.12.2014