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);
如下代码,重试不会生效
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说明
不建议使用RestTemplate,避免请求内容被处理
推荐使用hutool的HttpRequest等
尽量避免使用jsoup等工具在后端进行标签处理,防止前端样式丢失
常见工具和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);
}
@FunctionalInterface注解标注的
https://www.jianshu.com/p/52cdc402fb5d
OutputStream os = null;
try{
.....
}Catch(....){
.....
}finally{
//在这个代码块中需要关闭资源
os.close();
}
// 所有实现Closeable的类声明都可以写在里面,最常见的是用于流操作、socket操作、新版的httpclient也可以;需要注意的是,try()的括号中可以写多行声明,每个声明的变量类型都必须是Closeable的子类,用分号(;)隔开。从而可以简化许多的代码,不用再在finally中手动的关闭资源了。
try(
OutputStream os = new FileOutputStream("...");
){
//...
}catch (Exception e) {
//...
}