新增注解
@Documented
@Target({FIELD,METHOD,PARAMETER,ANNOTATION_TYPE})
@Retention(RUNTIME)
public @interface MyDateFormatDeserializer {
String pattern() default "yyyy-MM-dd HH:mm:ss";
String oldPattern() default "yyyy-MM-dd HH:mm:ss";
}
新增AOP切面类
@Aspect
@Component
public class MyDateFormatDeserializerAspect {
private static Logger log = LoggerFactory.getLogger(MyDateFormatDeserializerAspect.class);
@Pointcut("execution(* com.jovision.vse.*.*.web.controller..*.*(..))")
public void pointCut() {
}
@Around("pointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
//转换
dateFormat(joinPoint);
return joinPoint.proceed();
}
public void dateFormat(ProceedingJoinPoint joinPoint) {
Object[] objects = null;
try {
objects = joinPoint.getArgs();
if (objects.length != 0) {
for (int i = 0; i < objects.length; i++) {
//当前只支持判断对象类型参数
convertObject(objects[i]);
}
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("参数异常");
}
}
private void convertObject(Object obj) throws IllegalAccessException {
if (Objects.isNull(obj)) {
log.info("当前需要转换的object为null");
return;
}
String timeZoneStr = CurrentUserUtil.currentTimeZone();
if(StringUtils.isNotBlank(timeZoneStr)){
List<Field> fieldList = getSuperFields(obj.getClass(),true);
for (Field field : fieldList) {
boolean containFormatField = field.isAnnotationPresent(MyDateFormatDeserializer.class);
if (containFormatField) {
//获取访问权
field.setAccessible(true);
MyDateFormatDeserializer annotation = field.getAnnotation(MyDateFormatDeserializer.class);
String oldPattern = annotation.oldPattern();
String newPattern = annotation.pattern();
Object dateValue = field.get(obj);
if (Objects.nonNull(dateValue) && !StringUtils.isEmpty(oldPattern) && !StringUtils.isEmpty(newPattern)) {
String newValue = StringUtils.EMPTY;
try {
Date date = new Date();
if(dateValue instanceof Date){
date = (Date) dateValue;
}else if(dateValue instanceof String){
date = DateUtils.parseDate(dateValue.toString(), oldPattern);
}else{
log.error("parse date error,@MyDateFormatDeserializer must String or Date !!!");
return;
}
SimpleDateFormat currentTime = new SimpleDateFormat(newPattern);
TimeZone timeZone = TimeZone.getTimeZone(timeZoneStr);
currentTime.setTimeZone(timeZone);
newValue = currentTime.format(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
log.info("aop transform success - oldValue = {}, newValue = {} ",dateValue , newValue);
field.set(obj, newValue);
}
}
}
}
}
/**
* 获取类的所有属性(含所有父级类)
* @param clazz
* @param containSuperClass
* @return
*/
private List<Field> getSuperFields(Class<?> clazz, boolean containSuperClass) {
List<Field> fieldList = new ArrayList<>();
//取父类属性
while (clazz != null) {
fieldList.addAll(Arrays.asList(clazz.getDeclaredFields())); //添加当前类全部属性
if(containSuperClass){
// 父类
clazz = clazz.getSuperclass();
}else{
clazz = null;
}
}
return fieldList;
}
}
Controller传参字段添加注解
@Data
public class TestDto {
/**
* 查询的开始时间
*/
@MyDateFormatDeserializer
private String queryStartTime;
/**
* 查询的结束时间
*/
@MyDateFormatDeserializer
private String queryEndTime;
}
结束
这样,前端请求进到Controller后,开始执行业务逻辑之前,会将指定字段转化完时区并参与执行业务逻辑。文章来源地址https://www.toymoban.com/news/detail-638011.html
文章来源:https://www.toymoban.com/news/detail-638011.html
到了这里,关于用AOP实现前端传参时间的时区转化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!