工作中问题

时间:2024-11-07 08:12:12

本人是一个刚工作的后端工程师,这篇文章记录工作中遇到的问题

1、返回给前端的ID一样问题:

@JsonSerialize(using = ToStringSerializer.class)注解是Jackson库提供的一个功能,用于自定义序列化过程。具体来说,它用于将对象序列化为字符串格式,而不是默认的JSON格式

@JsonSerialize(using = ToStringSerializer.class)注解的主要作用是:

  • 将数字类型转换为字符串:当你希望将数字(如LongBigDecimal)以字符串形式输出时,可以使用这个注解。这可以防止在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)注解,取决于你的具体需求:

  1. 默认行为

    • 如果你不需要特别处理Long类型的值(例如,确保它在JSON中总是以字符串形式出现),那么可以直接返回,不需要添加任何注解。
  2. JavaScript中的精度问题

    • JavaScript中的Number类型有一个安全整数范围,大约是-2^53 + 12^53 - 1(即Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER)。超出这个范围的整数在JavaScript中可能会丢失精度。
    • 如果你的Long类型的值可能会超出JavaScript的安全整数范围,那么使用@JsonSerialize(using = ToStringSerializer.class)注解将它们序列化为字符串可以避免精度丢失的问题。
  3. 前端需求

    • 如果前端应用需要Long类型的值以字符串形式接收(例如,某些前端框架或库在处理大整数时可能需要字符串),那么你应该使用@JsonSerialize(using = ToStringSerializer.class)注解。
  4. 数据库ID

    • 如果Long类型的属性是数据库的主键ID,并且你确定这些ID不会超出JavaScript的安全整数范围,那么通常不需要序列化为字符串。

总结来说,如果你没有遇到JavaScript中的精度问题,或者前端没有特别要求以字符串形式接收Long类型的值,那么可以直接返回Long类型的属性,不需要添加@JsonSerialize(using = ToStringSerializer.class)注解。如果你有上述提到的任何需求,那么使用这个注解将Long类型序列化为字符串是一个好的做法。

2、maven的依赖传递问题

maven的依赖具有传递性,当你项目中依赖了A坐标,A坐标中可能依赖了B坐标。所以,当你刷新maven时,显示,找不到某一个坐标C,但是你的项目中,没有依赖坐标C,那么可能坐标C在你依赖的依赖里面,进行仔细的查找。