У меня есть эта иерархия классов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
Исключение нечетно в том, что, кажется, не ссылаться на то, что я думаю, что это будет, но вы делаете ' loopVariable0.? child.? age', который будет вызываться, даже если дочерний элемент null, что вызовет этот NPE. – mkobit
@MikeKobit да, но каким-то образом он удерживает первый элемент в каком-то узле и сравнивает, может быть. поскольку добавление нулевого объекта во второй индекс внутри списка не вызывает никаких проблем, даже если первый элемент не соответствует критериям, третий элемент выполняется. –
Можете ли вы рассказать версию Mvel №. –