@JsonSerialize 注解失效

有一个需求是后端传递过来BigDecimal类型的数据是保留两位的,但是如果是整数前端就会自动把小数点后两位的零给省略掉。网上查了一下可以用jackson的@JsonSerialize注解自定类来实现这个功能。

        例如这个是实体类

@Data
@AllArgsConstructor // 有参构造
@NoArgsConstructor  // 无参构造
@Component
public class User {
    // 如果表的主键是自增长的,必须添加下面的注解。不然会报 argument type mismatch 参数不匹配错误。
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String username;
    @JsonIgnore
    private String password;
    private String createtime;

    // @JSONField(serializeUsing = BigDecimalSerializer.class)
    @JsonSerialize(using = BigDecimalSerializer.class)
    private BigDecimal money;
}

自定义处理类

public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {

    @Override
    public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (bigDecimal != null) {
            jsonGenerator.writeString(bigDecimal.setScale(2, RoundingMode.HALF_UP).toPlainString());

        }
    }
}

但是重点来了,没有仔细看接口的返回值,返回值是List<Map>。但是我的那个注解式作用在实体类上的,导致注解没生效。最后检查出来了,把接口的返回值改成List<User>之后就正常了。

 还有一种情况就是当前项目中同时又fastjson和jackson,配置的时候是使用fastjson,当你使用jackson的注解就不起作用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: @JsonSerialize注解是用来指定对象序列化时的规则的,如果不生效可能是以下原因: 1. 没有正确引入jackson-databind依赖包,需要在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> ``` 2. 没有在对象的属性上添加@JsonSerialize注解,需要在需要序列化的属性上添加注解,例如: ``` @JsonSerialize(using = CustomSerializer.class) private String name; ``` 3. 自定义的序列化器CustomSerializer没有实现JsonSerializer接口,需要实现该接口并重写serialize方法,例如: ``` public class CustomSerializer extends JsonSerializer<String> { @Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 自定义序列化逻辑 } } ``` 希望以上解答能够帮到您。 ### 回答2: @jsonserialize 注解是Jackson库中的注解,用于将Java对象序列化为JSON格式的字符串。但是,如果注解不生效,可能会导致JSON格式的输出不符合预期,甚至无法正确地反序列化为Java对象。以下是可能导致@jsonserialize注解不生效的几种情况: 1. 没有正确导入Jackson库:要使用@jsonserialize注解,首先需要导入Jackson库,包括jackson-databind和jackson-core。如果没有正确导入这些库,注解就无法生效。 2. 没有正确配置ObjectMapper:ObjectMapper是Jackson库中的核心类,用于将Java对象转换为JSON字符串。@jsonserialize注解需要ObjectMapper正确处理才能生效。如果ObjectMapper没有正确配置,注解就无法生效。例如,如果没有注册SimpleModule,@jsonserialize注解可能无法生效。 3. 注解没有正确应用于Java类或属性:要使用@jsonserialize注解,必须将它正确应用于Java类或属性。例如,如果应用于一个不存在的属性或类,注解就无法生效。另外,如果没有正确设置注解的属性,也可能导致注解不生效。 4. 没有正确设置访问器方法:如果在Java类中没有正确实现访问器方法,@jsonserialize注解也可能无法生效。例如,如果缺少getter或setter方法,注解就无法生效。 综上所述,要使@jsonserialize注解生效,需要正确导入Jackson库,正确配置ObjectMapper,正确应用注解,正确设置注解属性,并正确设置访问器方法。若存在以上出现错误,@jsonserialize注解就无法生效,并且可能导致程序出现异常。 ### 回答3: 在 Java 中,@jsonserialize 注解是用来控制对象在被序列化为 JSON 字符串时的格式的。如果 @jsonserialize 注解不生效,可能是以下几个原因: 1. 缺少 jackson-databind 依赖 @jsonserialize 注解是 jackson-databind 库中的一个注解,如果在 Maven 或 Gradle 等构建工具中没有正确引入该依赖,@jsonserialize 注解就不能生效。在 Maven 中,可以添加以下依赖: ``` <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.4</version> </dependency> ``` 2. 注解被错误使用 @jsonserialize 注解需要在目标属性上使用,而不是在目标类上使用。例如,以下代码就会导致注解不生效: ``` @JsonSerialize(using = CustomDateSerializer.class) public class User { ... } ``` 正确的使用方法是在对象的属性上使用 @jsonserialize 注解: ``` public class User { @JsonSerialize(using = CustomDateSerializer.class) private Date birthday; ... } ``` 3. 自定义序列化器未实现 如果包含 @jsonserialize 注解的属性使用了自定义的序列化器,那么需要确保自定义序列化器已正确实现。例如: ``` public class CustomDateSerializer extends JsonSerializer<Date> { @Override public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); gen.writeString(dateFormat.format(value)); } } ``` 以上是 @jsonserialize 注解不生效的几个原因以及解决方法。如果问题依然存在,可以检查代码、日志等,进一步排查问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值