-
[置顶]软件接口设计怎么做?前后端分离软件接口设计思路
本文关于软件接口设计怎么做?前后端分离软件接口设计思路。好的系统架构离不开好的接口设计,因此,真正懂接口设计的人往往是软件设计队伍中的稀缺型人才。为什么在接口制定标准中说:一流的企业做标准,二流的企业...
-
[置顶]接口管理如何做?接口实现版本管理的意义和最佳方法
本文关于接口管理如何做?接口实现版本管理的意义和最佳方法。API版本管理的重要性不言而喻,对于API的设计者和使用者而言,版本管理都有着非常重要的意义。下面会从WEB API 版本管理的角度提供几种常...
-
[置顶]实现API管理系统的关键
下面将通过几个关键词的形式说明API管理的重要性和未来的实现方式。1.生命周期管理在整个API生命周期中更深入地集成所有工具将进一步提高生命周期循环的速度,而且更重要的是提供满足消费者需求的API。这...
-
Java基础之Unsafe内存操作不安全类详解
Java基础之Unsafe内存操作不安全类详解简介Unsafe类使java拥有了像C语言的指针一样操作内存空间的能力,直接操作内存就意味着1、不受jvm管理,也就意味着无法被GC,需要我们手动GC,稍...
-
高考后网上查询信息,注意防范没有 SSL证书的网站
高考后网上查询信息,注意防范没有 SSL证书的网站2022年高考落下帷幕,考生们终于可以长舒一口气了。但是,高考后续志愿填报,信息查询等也都是非常重要的。尤其是在考生进行高考信息查询过程中,一定要注意...
-
逆向调试入门-基础知识
逆向调试入门-基础知识1、存储方式多字节数据存放顺序,分为大端存储、小端存储。大端存储模式:数据的低位保存在内存中的高地址中,数据的高位保存在内存中的低地址中;小端存储模式:数据的低位保存在内存中的低...
-
详解Java Socket通信封装MIna框架
详解Java Socket通信封装MIna框架核心类IoService :Mina中将服务端和客户端都看成是服务,这里提供统一接口IoService,这个接口的作用就是用来处理套接字机制。也正是IoS...
-
逆向调试入门-windows保护机制
逆向调试入门-windows保护机制如果一个计算机系统有多个用户,并且允许多个进程并发执行,那么数据访问应当加以控制。为此,可以通过机制确保只有经过操作系统授权,进程才可使用相应资源,如文件、内存、C...
-
浏览器的一个秘密,99%的人不知道!
浏览器的一个秘密,99%的人不知道!大家好,我是程序员小黑,一个资深的互联网黑科技软件玩家。每天给大家更新各种免费手机软件、各种好玩有趣的功能福利、高效率工具!只有你想不到,没有我找不到今天给...
-
$(document).ready(function(){
console.log('init');
$.ajax({url:"http://localhost:8080/getLongValue"})
.then(res=>{
console.log({
'getLongValue':res
});
$('#resId').text(res.id);
$('#idType').text(typeof res.id);
})
});
运行结果
通过输出结果和查看网络的内容,发现实际上id返回的结果是1234567890102349000,最后几位都变成了00, 这是因为,javascript的Number类型最大长度是17http://位,而后端返回的Long类型有19位,导致js的Number不能解析。
方案
既然不能使用js的Number接收,那么前端如何Long类型的数据呢,答案是js使用string类型接收
方案一 @JsonSerialize 注解
修改Dto的id字段,使用@JsonSerialize注解指定类型为string。
这个方案有一个问题,就是需要程序员明确指定@JsonSerialize, 在实际的使用过程中,程序员会很少注意到Long类型的问题,只有和前端联调的时候发现不对。
@Data
public static class GetLongValueDto{
@JsonSerialize(using= ToStringSerializer.class)
private Long id;
}
方案二 全局处理器
添加Configuration, 处理 HttpMessageConverter
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
/**
* 序列化json时,将所有的long变成string
* 因为js中得数字类型不能包含所有的java long值
*/
@Override
public void configureMessageConverters(List
> converters) { MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule=new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(0,jackson2HttpMessageConverter);
}
}
@Data
public static class GetLongValueDto{
private Long id;
}
发现没有@JsonSerialize注解的信息,前端接收到的数据,也是string类型了。
与swagger集成
上面只是解决了传输时的long类型转string,但是当集成了swagger时,swagger文档描述的类型仍然是number类型的,这样在根据swagger文档生成时,会出现类型不匹配的问题
swagger 文档集成
pom或gradle
implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0'
io.springfox springfox-boot-starter 3.0.0 查看文档, 发现 GetLongValueDto 描述的id类型是 integer($int64)
swagger long类型描述为string
需要修改swagger的配置, 修改 Docket 的配置
.directModelSubstitute(Long.class, String.class)
.directModelSubstitute(long.class, String.class)
@Configuration
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())//api的配置路径
.paths(PathSelectors.any())//扫描路径选择
.build()
.directModelSubstitute(Long.class, String.class)
.directModelSubstitute(long.class, String.class)
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("title") //文档标题
.description("description" alt="解析Spring Mvc Long类型精度丢失问题" title="解析Spring Mvc Long类型精度丢失问题" width="200" height="150">
解析Spring Mvc Long类型精度丢失问题
解析Spring Mvc Long类型精度丢失问题背景在使用Spring Boot Mvc的项目中,使用Long类型作为id的类型,但是当前端使用Number类型接收Long类型数据时,由于前端精度问...
-
逆向调试入门-了解PE结构文件
逆向调试入门-了解PE结构文件这里的PE文件指的是PE(Portable Executable)文件,即可移植的可执行文件,是 Windows 操作系统上主流的可执行文件。常见的 EXE、DLL、OC...
-
EasyCVR硬件盒子如何设置断电自启动
EasyCVR硬件盒子如何设置断电自启动EasyCVR是我们接入协议最广泛的视频平台,除了主流标准协议GB28181、RTSP/Onvif、RTMP等,还可支持厂家私有协议与SDK接入,比如海康Eho...
-
Java 内存安全问题的注意事项
Java 内存安全问题的注意事项前言java在内存管理方面是要比C/C++更方便的,不需要为每一个对象编写释放内存的代码,JVM虚拟机将为我们选择合适的时间释放内存空间,使得程序不容易出现内存泄漏和溢...
