移动端项目一个获取用户信息的接口,如下所示:
@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);
}
}