当前位置: 首页 > 后端技术 > Java

为Java属性添加注解,并标注其参数别名

时间:2023-04-02 01:12:32 Java

background在开发过程中,如果第三方接口参数的命名遵循一定的规范,我们封装请求体会更加方便整洁,通常不用太多注意。但是如果第三方接口的参数命名很随意怎么办?我们知道如果是POST请求,我们可以使用JSONField。但是如果我们不依赖fastjson来完成GET请求的字符串拼接呢?例如:/api/addUser?NAME=xiaoguaiguai&agenumber=78&sex_flag=0&ji_Guan=东北那家结合了多种命名规则,还包括拼音。此时您应该如何确保您的代码是干净的?1.定义属性注解由于属性对应的参数名称非常随机,我们打算手动记录。这样,我们需要一个注解:importjava.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)@Target(value={ElementType.FIELD})@Documented@Inheritedpublic@interfaceThirdApiParamName{/***参数名**@return*/Stringvalue();}2.在对应的参数信息体中添加属性注解注解使用起来非常简单,比如我们有一个UserAddDTO.class,直接标注即可。@DatapublicclassUserAddDTO{/***用户名*/@ThirdApiParamName("NAME")私有字符串名称;/***用户年龄*/@ThirdApiParamName("agenumber")privateintage;/***性别标志*0:女性*1:男性*/@ThirdApiParamName("sex_flag")privateintsexFlag;/***家乡*/@ThirdApiParamName("ji_Guan")privateStringnativePlace;}这样写有什么好处?如果另一个人从日志中看到打印请求的url字符串,发现一个奇怪的参数agenumber,他开始用Ctrl+Shift+F搜索,正好找到这个类。看到你的评论,他会明白了:啊,原来是年龄,他把两个字写在一起了。3.Java反射分析注解接下来,我们利用反射机制获取对应属性上注解填写的值和属性的值,进行拼接。我们可以把这部分写在工具类中。当然,如果你DDD,你可以有自己的考虑。我这里只给出函数体:publicstaticStringfulfilledUrlWithParams(StringurlPrefix,ObjectparamObject){try{ClassaClass=paramObject.getClass();Field[]declaredFields=aClass.getDeclaredFields();StringBuilderstringBuffer=newStringBuilder(urlPrefix);stringBuffer.append("?");StringJoinerparamStringJoiner=newStringJoiner("&");for(FielddeclaredField:declaredFields){//对于每个属性,获取其对应参数的名称declaredField.setAccessible(true);对象valueObj=declaredField.get(paramObject);if(valueObj==null||StringUtils.isBlank(valueObj.toString())){继续;}ThirdApiParamNameparamName=declaredField.getAnnotation(ThirdApiParamName.class);如果(paramName==null){继续;}paramStringJoiner.add(paramName.value()+"="+valueObj);}stringBuffer.append(paramStringJoiner.toString());返回stringBuffer.toString();}catch(Exceptione){e.printStackTrace();返回””;}这样我们就标准化了一个没有命名规则的第三方接口参数。这样,我们在封装了整个请求服务之后,开发团队就用自己写的服务,而不是每一个去面对第三方混乱的接口参数。其实这个设计不难想到。只要熟悉门面模式、代理模式、适配器模式,自然就会想到加一个中间层来屏蔽一些麻烦的细节。其实编程中涉及到的设计相关的内容,大部分都是中间层的艺术。思考题接下来给各位读者留一个思考题:在你的项目中,如果遇到同事之间的接口调用,对方的参数命名不规范,你该怎么办?欢迎大家在评论区留言,与其他读者共同探讨。