Springboot格式化给前端返回的时间格式

Springboot格式化给前端返回的时间格式

  • 新增注解
  • 新增注解执行逻辑
  • 建立注解及注解执行逻辑的关联
  • 将时间转换注解注入Spring容器
  • 在返回对象的属性中加入注解
  • 结束

新增注解

@Documented
@Target({FIELD,METHOD})
@Retention(RUNTIME)
public @interface DateFormatTransform {
    String pattern() default "";
}

新增注解执行逻辑

@Slf4j
@AllArgsConstructor
public class DateFormatTransformValidator extends JsonSerializer<Object> {

    private String pattern;

    @Override
    public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        try {
        	// 获取header传入的时区
            String timeZoneStr = CurrentUserUtil.currentTimeZone();
            if(StringUtils.isBlank(timeZoneStr)){
            	// 无需转换时区并返回原内容给前段
                jsonGenerator.writeObject(value);
            }else{
                Object outPut = value;
                if (value != null) {
                    Date date = new Date();
                    if (value instanceof Date) {
                        date = (Date) value;
                    } else if (value instanceof String) {
                        date = DateUtils.parseDate(value);
                    } else if (value instanceof Long) {
                        date = new Date((Long) value);
                    } else if (value instanceof LocalDateTime) {
                        date = Date.from( ((LocalDateTime) value).atZone( ZoneId.systemDefault()).toInstant());
                    } else if (value instanceof LocalDate) {
                        date = Date.from(((LocalDate) value).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
                    }
                    TimeZone timeZone = TimeZone.getTimeZone(timeZoneStr);
                    SimpleDateFormat currentTime = new SimpleDateFormat(pattern);
                    currentTime.setTimeZone(timeZone);
                    outPut = DateUtils.parseDate(currentTime.format(date),pattern);
                }
                // 转换时区并返回给前端
                jsonGenerator.writeObject(outPut);
            }
        }catch (Exception e){
            log.error("data transform error:", e);
        }
    }
}

建立注解及注解执行逻辑的关联

public class DateFormatTransformAnnotationIntrospector extends JacksonAnnotationIntrospector {

    @Override
    public Object findSerializer(Annotated annotated) {
        DateFormatTransform formatTransform = annotated.getAnnotation(DateFormatTransform.class);
        if(formatTransform != null){
            return new DateFormatTransformValidator(formatTransform.pattern());
        }
        return super.findSerializer(annotated);
    }
}

将时间转换注解注入Spring容器

@Configuration
public class WebServerConfig {

    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setDefaultCharset(StandardCharsets.UTF_8);
        ObjectMapper objectMapper = converter.getObjectMapper();
        objectMapper.setAnnotationIntrospector(new DateFormatTransformAnnotationIntrospector());
        return converter;
    }
}

在返回对象的属性中加入注解

@Data
public class TestVo {
    @DateFormatTransform(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
}

结束

注意:不一定只能给时间转换时区,可以按需使用这个返参的格式化代码,可能是想在服务的所有返回的字段中加入统一的内容,也可以使用这个

你可能感兴趣的:(spring,boot,前端,后端)