工作中问题
本人是一个刚工作的后端工程师,这篇文章记录工作中遇到的问题
1、返回给前端的ID一样问题:
@JsonSerialize(using = ToStringSerializer.class)
注解是Jackson库提供的一个功能,用于自定义序列化过程。具体来说,它用于将对象序列化为字符串格式,而不是默认的JSON格式。
@JsonSerialize(using = ToStringSerializer.class)
注解的主要作用是:
- 将数字类型转换为字符串:当你希望将数字(如
Long
或BigDecimal
)以字符串形式输出时,可以使用这个注解。这可以防止在JSON序列化过程中出现精度丢失的问题,尤其是在处理大数字时。
使用场景
- 避免精度丢失:在Java中,
Long
类型在序列化为JSON时可能会被转换为数字,这在某些情况下可能导致精度丢失,尤其是在JavaScript中处理大数字时。使用ToStringSerializer
可以确保这些数字以字符串形式输出,避免精度问题。 - 与前端交互:在某些情况下,前端可能需要以字符串形式接收某些数据(例如ID),使用该注解可以确保数据格式的一致性。
@JsonSerialize(using = ToStringSerializer.class)private Long id;
我这次就有一个Long类型的ID,由于没有使用@JsonSerialize注解,所以在返回给前端的时候,所有的ID都是一样的。在后端时,所有的ID数据正常,返回给前段时,所有的ID都一样,要加上@JsonSerialize注解才能正常返回。(Integer类型完全不用考虑这个问题。)
是否需要使用
@JsonSerialize(using = ToStringSerializer.class)
注解,取决于你的具体需求:
默认行为:
- 如果你不需要特别处理
Long
类型的值(例如,确保它在JSON中总是以字符串形式出现),那么可以直接返回,不需要添加任何注解。JavaScript中的精度问题:
- JavaScript中的
Number
类型有一个安全整数范围,大约是-2^53 + 1
到2^53 - 1
(即Number.MIN_SAFE_INTEGER
到Number.MAX_SAFE_INTEGER
)。超出这个范围的整数在JavaScript中可能会丢失精度。- 如果你的
Long
类型的值可能会超出JavaScript的安全整数范围,那么使用@JsonSerialize(using = ToStringSerializer.class)
注解将它们序列化为字符串可以避免精度丢失的问题。前端需求:
- 如果前端应用需要
Long
类型的值以字符串形式接收(例如,某些前端框架或库在处理大整数时可能需要字符串),那么你应该使用@JsonSerialize(using = ToStringSerializer.class)
注解。数据库ID:
- 如果
Long
类型的属性是数据库的主键ID,并且你确定这些ID不会超出JavaScript的安全整数范围,那么通常不需要序列化为字符串。总结来说,如果你没有遇到JavaScript中的精度问题,或者前端没有特别要求以字符串形式接收
Long
类型的值,那么可以直接返回Long
类型的属性,不需要添加@JsonSerialize(using = ToStringSerializer.class)
注解。如果你有上述提到的任何需求,那么使用这个注解将Long
类型序列化为字符串是一个好的做法。
2、maven的依赖传递问题
maven的依赖具有传递性,当你项目中依赖了A坐标,A坐标中可能依赖了B坐标。所以,当你刷新maven时,显示,找不到某一个坐标C,但是你的项目中,没有依赖坐标C,那么可能坐标C在你依赖的依赖里面,进行仔细的查找。