嘉祥县建设局网站,简历模板免费网站,重庆h5建站,备案查询seo查询背景
项目中使用WRITE_DATES_AS_TIMESTAMPS: true转换日期格式为时间戳未生效。如下#xff1a;
spring:jackson:time-zone: Asia/Shanghaiserialization:WRITE_DATES_AS_TIMESTAMPS: true尝试是否关于时间的注解是否会生效#xff0c;使用JsonForma和JsonFiled均失效。
常…背景
项目中使用WRITE_DATES_AS_TIMESTAMPS: true转换日期格式为时间戳未生效。如下
spring:jackson:time-zone: Asia/Shanghaiserialization:WRITE_DATES_AS_TIMESTAMPS: true尝试是否关于时间的注解是否会生效使用JsonForma和JsonFiled均失效。
常见失效原因及解决方法
JsonFormat是用于指定Java对象序列化为JSON字符串时的格式化方式的注解。如果JsonFormat失效可能是以下原因 未正确导入Jackson库注解位置不正确注解参数设置错误 解决方法
确认是否正确导入了Jackson库可以在pom.xml文件中添加以下依赖
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.12.3/version
/dependency2、确认注解位置是否正确例如
public class User {JsonFormat(pattern yyyy-MM-dd)private Date birthday;// ...
}3、确认注解参数是否正确设置例如
JsonFormat(shape JsonFormat.Shape.STRING, pattern yyyy-MM-ddTHH:mm:ss.SSSZ)
public Date getCreatedDate() {return createdDate;
}以上是常见的解决方法如果还有问题可以提供更具体的错误信息进行排查。
本次问题解决
失效原因
因为项目中使用了Gson替换Jackson。 代码如下
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import springfox.documentation.spring.web.json.Json;import java.lang.reflect.Type;public class JsonToGson implements JsonSerializerJson {Overridepublic JsonElement serialize(Json json, Type type, JsonSerializationContext context) {return JsonParser.parseString(json.value());}
}Configuration
public class SwaggerWebConfiguration implements WebMvcConfigurer {Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler(/swagger-ui/**).addResourceLocations(classpath:/META-INF/resources/webjars/springfox-swagger-ui/);}Overridepublic void configureMessageConverters(ListHttpMessageConverter? converters) {converters.removeIf(httpMessageConverter - httpMessageConverter instanceof MappingJackson2HttpMessageConverter);converters.add(gsonHttpMessageConverters());}Beanpublic GsonHttpMessageConverter gsonHttpMessageConverters() {Gson gson new GsonBuilder().registerTypeAdapter(Json.class, new SpringfoxJsonToGsonAdapter()).create();GsonHttpMessageConverter gsonConverter new GsonHttpMessageConverter(gson);return gsonConverter;}
}解决方案一去掉Gson转换即可。
解决方案二重新添加MappingJackson2HttpMessageConverter的bean
Autowired(required false)
private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;Override
public void extendMessageConverters(ListHttpMessageConverter? converters) {converters.removeIf(converter - converter instanceof MappingJackson2HttpMessageConverter);if (Objects.isNull(mappingJackson2HttpMessageConverter)) {converters.add(0, new MappingJackson2HttpMessageConverter());} else {converters.add(0, mappingJackson2HttpMessageConverter);}}或
Autowired(required false)
private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;Override
public void configureMessageConverters(ListHttpMessageConverter? converters) {converters.removeIf(converter - converter instanceof MappingJackson2HttpMessageConverter);if (Objects.isNull(mappingJackson2HttpMessageConverter)) {converters.add(0, new MappingJackson2HttpMessageConverter());} else {converters.add(0, mappingJackson2HttpMessageConverter);}
}解析 Jackson一直是springframework默认的json库从4.1开始springframework支持通过配置GsonHttpMessageConverter的方式使用Gson。 在Spring MVC中一旦请求退出Controller它将寻找一个视图来呈现。当指定了RequestBody或RestController时我们会告诉Spring跳过这一步将java对象通过model写入响应结果。Spring通过HttpMessageConverter来执行Java对象向其它类型通常是Json的转换Spring默认使用的是 MappingJackson2HttpMessageConverter所以如果希望使用Gson来执行这种转换可用使用GsonHttpMessageConverter替换Jackson。
小拓展 在Spring Boot提供了与三个JSON映射库的集成Gson、默认库 Jackson 、JSON-B JsonFormat与JSONField简介
JsonFormat JsonFormat是Java中的一个Jackson注解用于指定某个字段或属性或整个类的JSON序列化或反序列化格式。它允许在将数据类型转换为或从JSON格式转换时自定义日期、数字、布尔值等数据类型的格式。 例如如果您有一个Java类其中包含一个Date字段您希望以特定格式将其序列化为JSON您可以使用JsonFormat注解来指定该格式
示例如下Jackson在序列化或反序列化myDate字段时使用“yyyy-MM-dd”格式。
public class MyClass {JsonFormat(patternyyyy-MM-dd)private Date myDate;// ...
}JSONField JSONField是阿里巴巴的fastjson库中的一个注解用于指定Java对象属性在序列化为JSON字符串时的名称、顺序、格式等信息。例如可以使用JSONField(name“username”)指定Java对象属性在序列化为JSON字符串时使用username作为属性名。 区别 JsonFormat和JSONField都是用于控制Java对象属性在序列化为JSON字符串时的格式但是它们有一些不同之处。 JsonFormat是Jackson库中的一个注解用于指定Java对象属性在序列化为JSON字符串时的日期、时间、数字等格式。例如可以使用JsonFormat(pattern“yyyy-MM-dd HH:mm:ss”)指定Java对象属性在序列化为JSON字符串时使用指定的日期时间格式。
JSONField是阿里巴巴的fastjson库中的一个注解用于指定Java对象属性在序列化为JSON字符串时的名称、顺序、格式等信息。例如可以使用JSONField(name“username”)指定Java对象属性在序列化为JSON字符串时使用username作为属性名。
因此虽然JsonFormat和JSONField都可以用于控制Java对象属性在序列化为JSON字符串时的格式但是它们的作用范围和使用方式略有不同。
jackson自定义日期注解
依赖HttpMessageConverter默认实现如下 jacksonMappingJackson2HttpMessageConverter; gsonGsonHttpMessageConverter; fastjson FastJsonHttpMessageConverter 1、自定义转换类
public class DateToJsonSerializer extends JsonSerializerDate implements ContextualSerializer {private DateFormat df new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);public DateToJsonSerializer() {}Overridepublic void serialize(Date arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {if (null ! arg0) {arg1.writeString(this.df.format(arg0));}}Overridepublic JsonSerializer? createContextual(SerializerProvider prov, BeanProperty property) {AnnotationMap annotated property.getMember().getAllAnnotations();JsonFormat jsonFormat annotated.get(JsonFormat.class);if (jsonFormat ! null jsonFormat.pattern() ! null){df new SimpleDateFormat(jsonFormat.pattern());}return this;}
}2、使用
public class MyClass {JsonSerialize(using DateToJsonSerializer .class)private Date myDate;// ...
}翩若惊鸿婉若游龙。