超级超级小的技巧总结

1. 针对JSON转换

Map<String, Object> extendInfo = request.getExtendInfo();
// 获取出object类型的value
Object multiPartObject = extendInfo.get(PublishRequestExtendInfoEnum.WECHAT_MUTIPART_PUBLISH.getExtend());
// 先将value转为JSONstring,避免JSONArray.parseArray时因为转义符\而出现转换失败
String jsonString = JSONObject.toJSONString(multiPartObject);
List<WeChatPreviewDTO> weChatPreviewDTOS = JSONArray.parseArray(jsonString, WeChatPreviewDTO.class);

2. 关于@Retryable优雅重试引发的切面失效问题及解决方式

如下代码,重试不会生效

	public void retry() {
        doRetry();
    }

    @Retryable(maxAttempts = 10, backoff = @Backoff(value = 3000, multiplier = 2))
    public void doRetry() {
        throw new BizException("-1", "请重试");
    }

原因:由于retry用到了aspect增强,所有会有aspect的坑,就是方法内部调用,会使aspect增强失效,那么retry当然也会失效。

这个说的挺好的:AOP失败场景

解决方式1:通过代理对象调用

public void retry() {
        weChatPublishService.doRetry();
    }

解决方式2:获取当前类的代理类
调用时AopContext.currentProxy()获取当前类的代理类,需要在启动类上加注解@EnableAspectJAutoProxy(exposeProxy = true, proxyTargetClass = true)

	public void retry() {
		WeChatPublishService weChatPublishService = (WeChatPublishService) AopContext.currentProxy();
        weChatPublishService.doRetry();
    }
    
	@Retryable(value = BizException.class, maxAttempts = 10, backoff = @Backoff(value = 3000, multiplier = 2))
    @Override
    public void doRetry() {
        System.out.println("11111111");
        throw new BizException("-1", "发布中...请重试");
    }

EnableAspectJAutoProxy说明
在这里插入图片描述
在这里插入图片描述
关键:
在这里插入图片描述
proxyTargetClass:@EnableAspectJAutoProxy支持处理标有AspectJ的@Aspect批注的组件,用户可以主动声明proxyTargetClass来指定Spring AOP使用哪种动态代理方式来创建代理类(默认使用基于实现接口的JDK动态代理方式)。
exposeProxy:为了解决一些由于代理引发的切面失效问题,Spring AOP在Spring 4.3.1后引入了AopContext类来将代理类的引用存储在ThreadLocal中,通过AopContext可以快速获取当前类的代理类.默认为不支持,如果声明为true,即可使用AopContext获取代理类。

3. 第三方请求发布表情被转义

不建议使用RestTemplate,避免请求内容被处理
推荐使用hutool的HttpRequest等
尽量避免使用jsoup等工具在后端进行标签处理,防止前端样式丢失

4. 参数校验

常见工具和javax.validation.constraints和com.google.common.base.Preconditions
使用javax.validation.constraints,在对应参数中进行注解使用

	 /**
     * 渠道id
     */
    @NotBlank(message = "渠道id不允许为空")
    private String channelId;


    @Resource
    private Validator validator;
    
	Set<ConstraintViolation<DeliverRuleDTO>> violations = validator.validate(dto);
        if (CollectionUtils.isNotEmpty(violations)) {
            String errorMsg = StringUtils.joinWith(";", violations.stream().map(ConstraintViolation::getMessage).collect(toList()));
            return Result.fail("params_is_empty", errorMsg);
        }

5. 函数式接口

@FunctionalInterface注解标注的
https://www.jianshu.com/p/52cdc402fb5d

6. 对于需要关闭资源的操作


OutputStream os = null;
try{
	.....
}Catch(....){
	.....
}finally{
	//在这个代码块中需要关闭资源
	os.close();
}


// 所有实现Closeable的类声明都可以写在里面,最常见的是用于流操作、socket操作、新版的httpclient也可以;需要注意的是,try()的括号中可以写多行声明,每个声明的变量类型都必须是Closeable的子类,用分号(;)隔开。从而可以简化许多的代码,不用再在finally中手动的关闭资源了。
try(
	OutputStream os = new FileOutputStream("...");
){
	//...
}catch (Exception e) {
	//...
}

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值