当 @PathVariable 遇上.特殊字符,参数值获取不全问题解决

移动端项目一个获取用户信息的接口,如下所示:

@RequestMapping(value = "/getUserStatus/{userAccount}", method = RequestMethod.GET)
public Result getUserInfo(@PathVariable String userAccount) {

线上发现一个问题:查询参数为老外账号时,查不到数据,数据库明明是有的,于是分析老外账号有啥特点:laowai.wailao,中间有个小数点,而一般的账号比如zhangsan是没有小数点的,因此很有可能是小数点造成问题,用postman测试一下接口,发现传入的参数为laowai, 后面的.wailao丢了。

解决方案

在@RequestMapping的value中使用SpEL来表示,value中的{userAccount}换成{userAccount:.+},即@RequestMapping(value = "/getUserStatus/{userAccount:.+}", method = RequestMethod.GET)

最后,简单介绍一下(下面的可以不需要再看了),SpEL(Spring Expression Language),即Spring表达式语言,是比JSP的EL更强大的一种表达式语言。它可以在运行时查询和操作数据,尤其是数组列表型数据,因此可以缩减代码量,优化代码结构。

SpEL有三种用法,一种是在注解@Value中;一种是XML配置;最后一种是在代码块中使用Expression。

xml配置栗子:

<bean id="xxx" class="com.java.xxx.xxx">
    <!-- 同@Value,#{}内是表达式的值,可放在property或constructor-arg内 -->
    <property name="arg" value="#{表达式}">
</bean>

代码块栗子:

import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
 
public class SpELTest {
 
    public static void main(String[] args) {
 
        //创建ExpressionParser解析表达式
        ExpressionParser parser = new SpelExpressionParser();
        //表达式放置
        Expression exp = parser.parseExpression("表达式");
        //执行表达式,默认容器是spring本身的容器:ApplicationContext
        Object value = exp.getValue();
        
        /**如果使用其他的容器,则用下面的方法*/
        //创建一个虚拟的容器EvaluationContext
        StandardEvaluationContext ctx = new StandardEvaluationContext();
        //向容器内添加bean
        BeanA beanA = new BeanA();
        ctx.setVariable("bean_id", beanA);
        
        //setRootObject并非必须;一个EvaluationContext只能有一个RootObject,引用它的属性时,可以不加前缀
        ctx.setRootObject(XXX);
        
        //getValue有参数ctx,从新的容器中根据SpEL表达式获取所需的值
        Object value = exp.getValue(ctx);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值