Spring 表达式语言中的空检查

问题描述 投票:0回答:2

在检查集合对象内的日期字段中的空指针时遇到奇怪的行为

public class FilterTest {
       public static void main(String[] args) {
              Collection<EmployeeDto> employees = new ArrayList<EmployeeDto>();
           employees.add(new EmployeeDto("", 1111, new Date()));
           employees.add(new EmployeeDto("123", 2222, null));
           employees.add(new EmployeeDto("22", 3333, new Date()));
           employees.add(new EmployeeDto("22", 4444, null));
           employees.add(new EmployeeDto("11", 5555, null));
           employees.add(new EmployeeDto("22", 6666, null));
           employees.add(new EmployeeDto(null, 6666,null));

           StandardEvaluationContext stdContext = new StandardEvaluationContext();
           stdContext.setVariable("emps", employees);      

           ExpressionParser parser = new SpelExpressionParser();    


          **String key4= "#emps.?[dateOfBirth != null ? T(DateUtil).formatDate(dateOfBirth), 'dd/MM/yyyy').contains('25/07/2012') : false]" ;**          


              Collection<Object> proj1 = (Collection<Object>) parser.parseExpression(
                      key4).getValue(stdContext);
              System.out.println(proj1);    



}
class EmployeeDto {
       String name;
       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;
       }

       int age;
       Date dateOfBirth;

       public EmployeeDto(String name, int age, Date dateOfBirth) {
              this.name = name;
              this.age = age;
              this.dateOfBirth = dateOfBirth;
       }

    public Date getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(Date dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }
}

表达式应返回满足条件的对象集合。但现在,我收到一个异常,无法在 null 上找到 dateOfBirth。所以我尝试了一种新的表达方式

 String key4= "#emps.?[dateOfBirth != null ? T(DateUtil).formatDate(#emps.![dateOfBirth], 'dd/MM/yyyy').contains('25/07/2012') : false]" ;

这个效果很好。但是当我在集合的第一个对象中添加null时,它返回的结果为0,当我检查时,我发现null被传递给了DateUtil类的formatDate方法。即员工集合就像 `

employees.add(new EmployeeDto("", 1111, null)); // first value is null, and I am getting empty result, but there is one corrrect result
           **employees.add(new EmployeeDto("12", 2222, null));**
           employees.add(new EmployeeDto("22", 3333, new Date()));
           employees.add(new EmployeeDto("33", 4444, null));
           employees.add(new EmployeeDto("FIVE", 5555, null));
           employees.add(new EmployeeDto("SIX", 6666, null));
           employees.add(new EmployeeDto(null, 6666,null));

你能帮我解决这个问题吗?谁能告诉我应该使用正确的表达方式吗?

spring spring-el
2个回答
0
投票

在 DateUtil 类中,添加如下方法:

    public static boolean isSameDay(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);
        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);
        return isSameDay(cal1, cal2);
    }

然后就做:

StandardEvaluationContext stdContext = new StandardEvaluationContext();
stdContext.setVariable("emps", employees);
stdContext.setVariable("yourTestDate", new Date());
ExpressionParser parser = new SpelExpressionParser();   

String key4 = "#emps.?[T(DateUtil).isSameDate(dateOfBirth, yourTestDate)]" ;
Collection<Object> proj1 = (Collection<Object>) parser.parseExpression(key4).getValue(stdContext);
System.out.println(proj1);   

0
投票

您前几天问了类似的问题 - 在这种情况下,您需要对集合选择的结果进行投影。这是一个更简单的例子...

    Expression exp = new SpelExpressionParser()
        .parseExpression("(#emps.?[name != null]).![name.toUpperCase()]");

第一部分(...)选择那些符合条件的元素;然后它对新集合执行投影。

© www.soinside.com 2019 - 2024. All rights reserved.