您的当前位置:首页正文

超级超级小的技巧总结

2024-12-03 来源:个人技术集锦

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当然也会失效。

这个说的挺好的:

解决方式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说明

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) {
	//...
}

显示全文