当前位置: 首页 > news >正文

网站建设工作室是干嘛的全网营销整合营销

网站建设工作室是干嘛的,全网营销整合营销,一个企业官网多个营销型网站,作品集网站代码在部分场景中,后台的时间属性用的不是Date或Long,而是Instant,Java8引入的一个精度极高的时间类型,可以精确到纳秒,但实际使用的时候不需要这么高的精确度,通常到毫秒就可以了。 而在前后端传参的时候需要…

在部分场景中,后台的时间属性用的不是Date或Long,而是Instant,Java8引入的一个精度极高的时间类型,可以精确到纳秒,但实际使用的时候不需要这么高的精确度,通常到毫秒就可以了。

而在前后端传参的时候需要对Instant类型进行序列化及反序列化等处理,默认情况下,ObjectMapper是不支持序列化Instant类型的,需要注册JavaTimeModule才行,而且序列化的结果也不是时间戳,测试如下

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;import java.time.Instant;/*** Instant Jackson测试** @author yangguirong*/
@Slf4j
public class InstantTest {ObjectMapper objectMapper = new ObjectMapper();@Testvoid serializeTest() throws JsonProcessingException {objectMapper.registerModule(new JavaTimeModule());String str = objectMapper.writeValueAsString(Instant.now());log.info("serializeTest: {}", str);// serializeTest: 1691208180.052185000}@Testvoid deserializeTest() throws JsonProcessingException {objectMapper.registerModule(new JavaTimeModule());Instant instant = objectMapper.readValue("1691208180.052185000", Instant.class);log.info("deserializeTest: {}", instant);// deserializeTest: 2023-08-05T04:03:00.052185Z}
}

想要将其序列化为毫秒时间戳,需要对序列化及反序列化进行自定义

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import lombok.extern.slf4j.Slf4j;import java.io.IOException;
import java.time.Instant;/*** 自定义Instant序列化及反序列** @author yangguirong*/
public class InstantMillsTimeModule extends SimpleModule {public InstantMillsTimeModule() {this.addSerializer(Instant.class, new InstantMillisecondsSerializer());this.addDeserializer(Instant.class, new InstantMillisecondsDeserializer());}public static class InstantMillisecondsSerializer extends JsonSerializer<Instant> {@Overridepublic void serialize(Instant instant, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {if (instant == null) {jsonGenerator.writeNull();} else {jsonGenerator.writeNumber(instant.toEpochMilli());}}}@Slf4jpublic static class InstantMillisecondsDeserializer extends JsonDeserializer<Instant> {@Overridepublic Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {try {long mills = p.getValueAsLong();return mills > 0 ? Instant.ofEpochMilli(mills) : null;} catch (Exception e) {log.error("Instant类型反序列化失败!val: {}, message: {}", p.getText(), e.getMessage());}return null;}}
}

再来测试一下自定义的序列化及反序列化方式

import com.example.websocket.config.InstantMillsTimeModule;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;import java.time.Instant;/*** Instant Jackson测试** @author yangguirong*/
@Slf4j
public class InstantTest {ObjectMapper objectMapper = new ObjectMapper();@Testvoid serializeTest() throws JsonProcessingException {objectMapper.registerModule(new JavaTimeModule());String str = objectMapper.writeValueAsString(Instant.now());log.info("serialize: {}", str);// serialize: 1691208180.052185000}@Testvoid deserializeTest() throws JsonProcessingException {objectMapper.registerModule(new JavaTimeModule());Instant instant = objectMapper.readValue("1691208180.052185000", Instant.class);log.info("deserialize: {}", instant);// deserialize: 2023-08-05T04:03:00.052185Z}@Testvoid millsSerializeTest() throws JsonProcessingException {objectMapper.registerModule(new InstantMillsTimeModule());String str = objectMapper.writeValueAsString(Instant.now());log.info("millsSerializeTest: {}", str);// millsSerializeTest: 1691208541018}@Testvoid millsDeserializeTest() throws JsonProcessingException {objectMapper.registerModule(new InstantMillsTimeModule());Instant instant = objectMapper.readValue("1691208541018", Instant.class);log.info("millsDeserializeTest: {}", instant);// deserialize: 2023-08-05T04:09:01.018Z}
}

可以看到,结果是符合预期的,可以在毫秒时间戳和Instant之间相互转换。

在后台配置SpringBoot的时候,需要考虑两种情况,一种就是Instant作为RequestParam/PathVariable的情况,另一种是RequestBody/ResponseBody的情况。前者借助转换器实现,配置如下

import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.time.Instant;/*** web mvc设置** @author yangguirong*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addConverter(instantConvert());}public Converter<String, Instant> instantConvert() {// 不能替换为lambda表达式return new Converter<String, Instant>() {@Overridepublic Instant convert(String source) {if (StringUtils.hasText(source)) {return Instant.ofEpochMilli(Long.parseLong(source));}return null;}};}
}

后者如果是局部配置,则在具体的实体类属性上添加@JsonSerialize@JsonDeserialize注解,在注解中指定序列化器和反序列化器即可。如果是全局配置,则可以按照如下方式进行配置,将InstantMillsTimeModule注册为Bean,这个Bean会在JacksonAutoConfiguration中的StandardJackson2ObjectMapperBuilderCustomizer被自动注入,然后进行注册。

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Jackson配置** @author yangguirong*/
@Configuration
@AutoConfigureBefore(JacksonAutoConfiguration.class)
public class JacksonCustomizerConfig {@Beanpublic Jackson2ObjectMapperBuilderCustomizer jacksonModuleRegistryCustomizer() {return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, SerializationFeature.FAIL_ON_EMPTY_BEANS);}@Beanpublic InstantMillsTimeModule instantMillsTimeModule() {return new InstantMillsTimeModule();}
}

简单的接口测试

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;import java.time.Instant;/*** instant测试** @author yangguirong*/
@Slf4j
@RequestMapping("instant")
@RestController
public class InstantTestController {@GetMapping("getInstant")public Instant getInstant() {return Instant.now();}@PutMapping("setInstant")public void setInstant(@RequestParam Instant instant) {log.info("setInstant: {}", instant);}@GetMapping("getInstantDemoVO")public DemoVO getInstantDemoVO() {return new DemoVO(Instant.now());}@PutMapping("setInstantDemoVO")public void setInstantDemoVO(@RequestBody DemoVO vo) {log.info("setInstantDemoVO:{}", vo);}@Data@NoArgsConstructor@AllArgsConstructorstatic class DemoVO {private Instant instant;}
}
http://www.dinnco.com/news/23889.html

相关文章:

  • 沂源手机网站建设公司app引流推广方法
  • 宿州网站建设报价公司官网怎么做
  • scratch编程大连seo按天付费
  • 网站设计设计方案深圳网络推广公司
  • 如何用图片文字做网站外链在线发布工具
  • 东莞网站搭建哪家强seo软文代写
  • 码云可以做博客网站吗端点seo博客
  • 大型行业门户网站开发建设买转发链接
  • 网站建设的一般过程广告设计与制作需要学什么
  • html做的网站排版错误优秀品牌策划方案
  • 正规的家居行业网站开发百度推广电话是多少
  • xml做web网站公司网络推广
  • 怎么把网站开发成crx优化网站推广排名
  • 西安网站开发招聘明天上海封控16个区
  • 数码科技网站获客软件
  • 个人做网站要备案吗天津搜索引擎seo
  • 舟山网站建设环球网疫情最新
  • 婚庆网站开发的意义东莞网站建设方案外包
  • 政府门户网站 建设关联词有哪些
  • 完整网站源码下载网站seo报告
  • wordpress dux3.0主题科学新概念seo外链平台
  • 叫人做网站多少钱百度宣传推广费用
  • 做淘宝详情的网站提交网址给百度
  • jsp动态网站开发技术毕业论文网站推广策划书模板
  • 做网站实训报告广州seo推荐
  • 平阳手机网站制作网络营销与策划实践报告
  • 网站功能说明书大连网站制作
  • 乐清做网站的公司网站权重
  • 网页设计个人简历怎么做厦门seo关键词排名
  • 哪个网站做化妆品效果好学技术的培训学校