2014-11-10 3 views
4

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

StudentClass .Java

public class StudentClass { 

    private List<Student> studentList; 

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

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

Student.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 является null, но если child1 null 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 
+0

Исключение нечетно в том, что, кажется, не ссылаться на то, что я думаю, что это будет, но вы делаете ' loopVariable0.? child.? age', который будет вызываться, даже если дочерний элемент null, что вызовет этот NPE. – mkobit

+0

@MikeKobit да, но каким-то образом он удерживает первый элемент в каком-то узле и сравнивает, может быть. поскольку добавление нулевого объекта во второй индекс внутри списка не вызывает никаких проблем, даже если первый элемент не соответствует критериям, третий элемент выполняется. –

+0

Можете ли вы рассказать версию Mvel №. –

ответ

0

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

Я приложил Exception

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 
+0

Я использую '2.2.0.Final' –

+0

@Mike Brock нужны ваши комментарии, если ошибка MVEL, как я могу сообщить. –

+0

@tobias_k нужны ваши комментарии, если ошибка MVEL, как я могу сообщить. –