在Java中拆分和验证比较表达式

时间:2018-09-23 09:27:00

标签: java json rest jax-rs

我正在建立一个休息服务。我的服务Resource方法是这样的:

public Response<List<AuditEvent>> getAuditEvents(@QueryParam("filters") List<AuditRequest.Filter> filters,
                                                 @QueryParam("orderBy") @DefaultValue("id") String order,
                                                 @QueryParam("isDesc") @DefaultValue("true") boolean desc,
                                                 @QueryParam("startTime") long startTimestamp,
                                                 @QueryParam("endTime") long endTimestamp,
                                                 @QueryParam("limit") @DefaultValue("20") int size,
                                                 @QueryParam("offset") @DefaultValue("0") int startIndex)

这里的过滤器可以是多个表达式,例如:

/api/audit/query/?filters=username='admin'&filters=customerId=1&limit=1&orderBy=rowId&isDesc=false&offset=2

我也创建了一个Filter类:

public static class Filter {
    private String propertyId;
    private String op;
    private Object value;

}

请向我建议一种将Resource方法中的List<String>转换为List<Filters>并验证每个String表达式是否有效的好方法。基本上,我需要一个解析器将此字符串表达式转换为我的过滤器对象,其中运算符可以是任何有效的运算符。

1 个答案:

答案 0 :(得分:2)

我认为您的查询不够清晰和精简。

请考虑:

https://github.com/jirutka/rsql-parser

一些例子:

  • name ==“杀死条例草案”; year = gt = 2003
  • name ==“杀死比尔”和year> 2003
  • 流派= in =(科幻,动作);(导演=='克里斯托弗·诺兰',演员== *贝尔); year = ge = 2000
  • 流派= in =(科幻,动作)和(导演=='克里斯托弗·诺兰'或演员== *贝尔)和年份> = 2000
  • director.lastName == Nolan; year = ge = 2000; year = lt = 2010

如果要编写自己的解决方案,请考虑矩阵变量: filter = name = abc; age> 40; ....

希望它能起作用。