大家好,最近忙于项目需求,玩命的开发,™的累死了。 闲下来回顾一下项目中遇到的坑,顺便记录一下。
1 首先是和前端对接过程中遇到的问题
- 问题描述:前端调用我发布测试环境的接口,GET请求。参数什么的,分页信息都传的很对,结果返回的值确实空的。。。很是费解。可是我在本地进行调试的时候却是有数据的。这是为什么呢? 后来我才发现,经过断点调试,结果我发现我在接口的model类中
期次id 为 空字符串。 这就找到原因所在了。前端列表查询的时候如果参数为空的话,那么他默认给传的是空字符串,然后走Nginx,在转发到我的接口上,我接到的参数是这样的, 例子:这个是前端传给我的链接 http://127.0.0.1:8080/api/xxx/flowers/61a8458c4a4edb41696b8866/awards-records/export?dpAccount=&stageId=&pageNum=1&pageSize=10000000 。 大家看到stageId 这个字段,为空的话就会拼接在接口路径中。所以,我想了办法把参数为空的字段替换成null。就完美搞定。
ps:此接口必须是GET请求的情况下才会出现次问题。
解决办法:
自定义注解进行拦截为空字符串的字段置为null。
代码如下 自定义注解
@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Empty2Null { }
2 添加 Empty2Null 注解切面拦截
`
@Aspect
@Component
public class Empty2NullAspect {
@Pointcut("@annotation(com.dapeng.cloud.service.wh.infrastructure.annotaion.Empty2Null)")
public void execudeService() {
}
@Around("execudeService()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] args = joinPoint.getArgs();
//遍历参数 修改带有需求字段对象的值
for (Object obj : args) {
try {
Class<?> clazz = obj.getClass();
Field[] fieldInfo = clazz.getDeclaredFields();
for (Field field : fieldInfo) {
field.setAccessible(true);
Object val = field.get(obj);
//值为 空字符串 时 赋值为 null
if (null != val && "".equals(val)) {
field.set(obj, null);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return joinPoint.proceed(args);
}
}
`
然后使用方法在 GET请求控制器Controller中即可解决前端传参为空查询不到数据的问题。