如何在SpringREST中创建查询解析器来解析查询参数
我的查询参数如下:如何在SpringREST中创建查询解析器来解析查询参数,spring,rest,Spring,Rest,我的查询参数如下: q=name:abc+age:20+roleid:(23|45)|audeince:(23|24).Here + is for AND | is for OR 我必须接受这个查询参数,因为它进入我的spring控制器,并且必须向solar进行查询以获取数据  @控制器 @请求映射(“/user”) 公共类图书管理员{ @RequestMapping(value=“/details”,method=RequestMethod.GET) 公共响应权限getUser(最终Htt
q=name:abc+age:20+roleid:(23|45)|audeince:(23|24).Here + is for AND | is for OR
我必须接受这个查询参数,因为它进入我的spring控制器,并且必须向solar进行查询以获取数据

@控制器
@请求映射(“/user”)
公共类图书管理员{
@RequestMapping(value=“/details”,method=RequestMethod.GET)
公共响应权限getUser(最终HttpServletRequest请求){
字符串params=requestParams.get(“q”)[0];
//在apache solar中传递此字符串以进行查询
}
}
我需要编写一个解析器来拆分参数值以进行solar查询。如何编写一个查询解析器来拆分上述url以使solar查询满足OR和条件。name:abc+age:20+roleid:(23 | 45)| audeince:(23 | 24)表示创建一个solar查询,其中name=abc,age=20,roleid in(23,24)或publications in(23,24)。这样用户就可以发送查询
例如:firstName:(abc | bcd)+lastName:abc+emailId:abc+dsID:abc | countryCd:US+audenceid:(123+678)
首先像这样使用正则表达式转换
名字:(abc | bcd)+------------段1
姓氏:abc+………段2
emailId:abc+………第3部分
dsID:abc |----------段4
countryCd:美国+--------------细分市场5
听众ID:(123+678)---第6段
就像url中可能出现的许多片段一样
我有一门课叫
Queryobj类{
私有字符串字段
私有列表值
私有字符串运算符
私有字符串外部运算符
}
firstName:(abc | bcd)+再次使用这样的正则表达式映射
字段=名字
值={abc,bcd}
内部操作员=|
外部运算符=+
比如第二段emailId:abc+
字段=电子邮件ID
值=abc
internalOperator=null
外部运算符=+
其他段也一样。如果有n个段,则有n个对象
然后将每个对象添加到链表中。如果internalOperator或externalOperator为null,则将其保留为null。如何实现这一点您可以使用此正则表达式模式获取“key:value operator”段
你能发布控制器代码说明你尝试过什么吗?这个字符串是什么意思?它由哪些部分组成?只要我们必须猜测它的意思,我们就只能猜测如何解析它。@Controller@RequestMapping(“/user”)公共类BooksController{@RequestMapping(value=“/details”,method=RequestMethod.GET)公共响应属性getUser(最终HttpServletRequest请求){String params=requestParams.GET(“q”)[0];//传递此字符串以在服务类中进行查询}请回答您想添加代码的问题。不要将代码放入注释中,这很难阅读。请查看Lutz Horn或Gyanapriya,并告诉我请解释我无法理解的详细代码。itI需要一个解决方案,该解决方案将提取键值对以及运算符(and,or),然后将其放入数据结构中,以便用于查询。还有运算符(and,or)满足于键值对dknight您能否帮助我从第一个示例开始,我假设此查询字符串由以下样式组成:q->“key:values op”key->[a-zA-z0-9]op->[+|]、values->[a-zA-Z_0-9]或([a-zA-Z_0-9])。我认为可以首先匹配模式:(\w),然后使用运算符“+”或“|”拆分q字符串。我怀疑为什么“+”存在于字符串中:(123+456)?+在字符串中表示年龄=123,年龄=456
@Controller
@RequestMapping("/user")
public class BooksController {
@RequestMapping(value="/details", method=RequestMethod.GET)
public ResponseEntity<?> getUser(final HttpServletRequest request) {
String params = requestParams.get("q")[0];
//passing this string to make query in apache solar
}
}
Pattern keyValuePattern = Pattern.compile("[\\w]+:([\\w@.]+|\\([\\w|+@.]+\\))[+|]?");