首页 > 其他分享 >【Emoji】Spring 通过注解 处理 转换 Emoji

【Emoji】Spring 通过注解 处理 转换 Emoji

时间:2022-12-13 10:37:40浏览次数:58  
标签:String Spring 60 注解 import 1000 annotation Emoji


 

 

依赖

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.6</version>
</dependency>

<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>4.0.0</version>
</dependency>

 

 

 

注解

package com.xxx.base.common.aop;

import java.lang.annotation.*;

/**
* @author Mr.Guan
* @Title: 转换Emoji表情
* @Package ${package_name}
* @Description: ${todo}
* @Mail [email protected]
* @date 2019
*/
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EmojiAnn {


//增加参数,用来支持不同的业务

/**
* 需要转换Emoji表情的参数下标 0开始
* @return
*/
int[] appointInd() default {};

}

 

 

AOP

package com.xxx.base.common.aop;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.extra.emoji.EmojiUtil;
import cn.hutool.json.JSONUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Objects;

/**
* @program:
*
* @description: 转换Emoji表情aop
*
* @author: Mr.Guan
*
* @Mail: [email protected]
*
* @create: 2019
**/
@Component
@Scope
@Aspect
public class EmojiAspect {

/**
* Service层切点 增加时间日志
* TODO 该路径应写成TimerLogHutool注解的路径
*/
@Pointcut("@annotation(com.xxx.base.common.aop.EmojiAnn)")
public void ServiceAspect() {

}

@Around("ServiceAspect()")
public Object around(ProceedingJoinPoint joinPoint) {
Object obj = null;


// //获取方法名称
// String methodName = joinPoint.getSignature().getName();
// //获取类名
// String name = joinPoint.getTarget().getClass().getName();
// //开启计时
// TimeInterval timer = DateUtil.timer();
// Console.log("【计时器@TimerLog】{}.{} - 开启计时,方法执行中...", name, methodName);
try {
//获取注解中的参数
MethodSignature m = (MethodSignature)joinPoint.getSignature();

//获取需要转换Emoji的参数下标
EmojiAnn annotation = m.getMethod().getAnnotation(EmojiAnn.class);
int[] appoint = annotation.appointInd();


Object[] args = joinPoint.getArgs();

for (int i = 0; i < args.length; i++) {

//判断是否需要转换Emoji
if(ArrayUtil.isNotEmpty(appoint)){
if(!ArrayUtil.contains(appoint, i)){
continue;
}
}


Object arg = args[i];
if(arg instanceof HttpServletRequest){
continue;
// }else if(arg instanceof Integer){
// continue;
}else if(NumberUtil.isNumber(Objects.toString(arg, ""))){
continue;
}


String s = JSONUtil.toJsonStr(arg);

boolean isJson = JSONUtil.isJson(s);

s = EmojiUtil.toAlias(s);

if(isJson){
Class<?> aClass = arg.getClass();
args[i] = JSONUtil.toBean(s, aClass);
}else{
args[i] = s;
}


}

//执行方法
obj = joinPoint.proceed(args);

String s = JSONUtil.toJsonStr(obj);
String s1 = EmojiUtil.toUnicode(s);

if(JSONUtil.isJson(s)){
obj = JSONUtil.toBean(s1, obj.getClass());
}else{
obj = s1;
}


// Console.log("【计时器@TimerLog】{}.{} - 结束计时,用时:{} 。", name, methodName, this.formatDuring(timer.interval()));

} catch (Throwable e) {
// Console.error("【计时器@TimerLog】{}.{} - 方法出错,结束计时,用时:{} 毫秒,错误信息:{}。", name, methodName, timer.interval(), e.getMessage());
e.printStackTrace();
}
return obj;
}

private String formatDuring(long mss) {

long days = mss / (1000 * 60 * 60 * 24);

long hours = (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);

long minutes = (mss % (1000 * 60 * 60)) / (1000 * 60);

long seconds = (mss % (1000 * 60)) / 1000;

long msec = (mss % 1000);

String msg = "";

if(days > 0){
msg += days + "天 ";
}
if(hours > 0){
msg += hours + "时 ";
}
if(minutes > 0){
msg += minutes + "分 ";
}
if(seconds > 0){
msg += seconds + "秒 ";
}
if(msec > 0){
msg += msec + "毫秒";
}

return msg;

}

public static void main(String[] args) {

int[] arr = {0,1,3,5};


}


}

 

 

 

标签:String,Spring,60,注解,import,1000,annotation,Emoji
From: https://blog.51cto.com/u_14976802/5932927

相关文章

  • Spring Boot命令指定环境启动jar包
    原文地址:SpringBoot命令指定环境启动jar包-Stars-One的杂货小窝记下通过命令行的方式去改变springboot项目中的环境配置信息命令项目中有以下配置application.yml......
  • spring boot 拦截器
    springboot使用拦截器1.创建拦截器类,继承HandlerInterceptor2.注册拦截器,指定拦截规则springframework中的拦截器类需要继承与HandlerInterceptor,springboot也是......
  • SpringBoot引入外部jar包,并打包到项目jar包中
    SpringBoot引入外部jar包,并打包到项目jar包中在网上下载需要的jar包,在项目中新建文件夹将jar包放进去通过File->ProjectStructure引入选中jar包加载成功后,ja......
  • Springboot多数据源使用示例
    1、配置文件spring.datasource.url=jdbc:mysql://198.168.1.1:3306/user?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&rewriteBatchedStatements=true&t......
  • springboot 简单设置mysql用户名密码加密
     如何将yml文件中暴露的数据库用户名和密码由明文改为密文,提高安全性。个人觉得是最简单的方式实现yml代码,用户名密码使用文章后面提供的加密算法或者自行寻找方法spr......
  • SpringBoot 自动装配的原理分析
    关于SpringBoot的自动装配功能,相信是每一个Java程序员天天都会用到的一个功能,但是它究竟是如何实现的呢?今天阿粉来带大家看一下。自动装配案例首先我们通过一个案例......
  • springMvc4-第一个spring mvc项目
    一个SpringMVC的项目如何创建?请看这里。代码编辑器:IntellijIDEA请提前在电脑上配置好自己的tomcat!该文属于小白教程,适合初学者。1创建SpringMVC项目第一步,点击新建项目......
  • springMvc32-原生apiSpring MVC过滤器-HiddenHttpMethodFilter
    浏览器form​​表单​​只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE......
  • spring mvc环境之静态资源放行(十二)
     方法一:引入mvc命名空间,会先经过自定义的Convertor<!--通过mvc:resources设置静态资源,这样servlet就会处理这些静态资源,而不通过控制器设置不过滤内容,比如:css,js......
  • SpringBoot常用注解
    @SpringBootApplication定义在main方法入口类,用于启动springboot应用项目@EnableAutoConfiguration让springboot根据类路径中的jar包依赖当前项目进行配置@ImportRes......