原生spring fastjson 对返回的时间搓格式化
时间: 2023-05-08 21:00:43 浏览: 203
原生Spring没有直接支持Fastjson对返回的时间戳进行格式化的功能。然而,可以通过自定义一个ResponseBodyAdvice实现这一功能。
首先,需要创建一个步骤如下的类:
```
@ControllerAdvice
public class DateSerializerAdvice implements ResponseBodyAdvice<Object> {
private final Converter<String, Date> dateConverter;
public DateSerializerAdvice() {
this.dateConverter = new DateConverter();
}
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if (body == null) {
return null;
}
if (body instanceof String) {
return body;
}
if (body instanceof Collection) {
Collection<Object> collection = (Collection<Object>) body;
collection.forEach(this::serializeTimestampField);
return collection;
}
serializeTimestampField(body);
return body;
}
private void serializeTimestampField(Object object) {
try {
BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
Method readMethod = propertyDescriptor.getReadMethod();
Method writeMethod = propertyDescriptor.getWriteMethod();
if (readMethod == null || writeMethod == null) {
continue;
}
if (readMethod.getReturnType() != Long.class) {
continue;
}
if (writeMethod.getParameterTypes().length != 1 || writeMethod.getParameterTypes()[0] != Date.class) {
continue;
}
Long timestamp = (Long) readMethod.invoke(object);
if (timestamp == null) {
continue;
}
Date date = dateConverter.convert(timestamp.toString());
writeMethod.invoke(object, date);
}
} catch (Exception e) {
// 日志处理
}
}
}
```
上述类通过实现ResponseBodyAdvice接口,并重写beforeBodyWrite方法实现了对返回的对象中的时间戳字段进行格式化。
在beforeBodyWrite方法中,先判断返回值类型是否为字符串或者null,如果是则直接返回原值。
如果返回值类型为集合,则遍历集合中的每个元素并调用serializeTimestampField方法进行处理。
serializeTimestampField方法中,我们利用Java内省机制寻找对象中类型为Long的字段,并检查其是否有对应的set方法。如果存在,则调用Fastjson提供的DateConverter将时间戳字符串转换为Date对象,并调用set方法设置格式化好的Date值。
最后,在Spring的配置文件中,通过以下配置将我们的自定义类进行注册:
```
@Configuration
public class DateSerializerConfig implements WebMvcConfigurer {
@Autowired
private DateSerializerAdvice dateSerializerAdvice;
@Override
public void addInterceptors(InterceptorRegistry registry) {
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
}
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
handlers.add(dateSerializerAdvice);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}
}
```
上述配置类中,我们将自定义的类通过addReturnValueHandlers方法添加到返回值处理器中即可。
通过以上步骤,我们就成功实现了原生Spring框架下对返回的时间戳进行格式化的功能。
阅读全文