在Spring Data Couchbase中使用@JsonSerialize和@JsonDesirialize

问题描述

要求是在沙发床实体类中,我应该有一个BigDecimal字段,以便在持久化实体之前进行的所有计算都可以具有更高的精度,但是BigDecimal不能作为沙发床中的单个值持久化,

>
"num": {
    "scale": 4,"intCompact": 232564,"precision": 6
  }

其中num是BigDecimal字段的名称,所以我想要将BigDecimal值序列化为double,同时将实体保留为json,反之亦然,同时从沙发床中获取它,我正在使用自定义序列化程序和反序列化程序,但根本不会调用它们,下面是代码

import com.couchbase.example.jsonutil.BDtodoubleSerializer;
import com.couchbase.example.jsonutil.DoubletoBDDesirializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Accesstype;
import org.springframework.data.annotation.Id;
import org.springframework.data.couchbase.core.mapping.Document;
import org.springframework.data.couchbase.core.mapping.Field;

import java.math.BigDecimal;

@Document
@Getter
@Setter
public class LocalEntity
{
    @Id
    @Field
    private String id;

    @JsonSerialize(using = BDtodoubleSerializer.class)
    @JsonDeserialize(using = DoubletoBDDesirializer.class)
    @Accesstype(Accesstype.Type.PROPERTY)
    private BigDecimal num;
}
import com.couchbase.example.entity.LocalEntity;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface LocalEntityRepo extends CrudRepository<LocalEntity,String> {
}
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;
import java.math.BigDecimal;

@JsonComponent
public class BDtodoubleSerializer extends StdSerializer<BigDecimal> {


    public BDtodoubleSerializer() {
        this(null);
    }

    public BDtodoubleSerializer(Class<BigDecimal> t) {
        super(t);
    }

    @Override
    public void serialize(BigDecimal value,com.fasterxml.jackson.core.JsonGenerator gen,com.fasterxml.jackson.databind.SerializerProvider provider) throws IOException {
        System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
        gen.writeString(value.toPlainString());
    }

}
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;
import java.math.BigDecimal;

@JsonComponent
public class DoubletoBDDesirializer extends StdDeserializer<BigDecimal> {

    public DoubletoBDDesirializer() {
        this(null);
    }

    @Override
    public BigDecimal deserialize(com.fasterxml.jackson.core.JsonParser p,com.fasterxml.jackson.databind.DeserializationContext ctxt) throws IOException,com.fasterxml.jackson.core.JsonProcessingException {
        System.out.println("###########################");
        return new BigDecimal(p.getValueAsstring());
    }

    public DoubletoBDDesirializer(Class<?> vc) {
        super(vc);
    }
}
import com.couchbase.example.entity.LocalEntity;
import com.couchbase.example.repo.LocalEntityRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;

@Service
public class LocalEntityService {

    @Autowired
    LocalEntityRepo repo;

    public void saveLocalEntity()
    {
        LocalEntity le = new LocalEntity();
        le.setId(UUID.randomUUID().toString());
        le.setNum(BigDecimal.valueOf(23.2564));
        repo.save(le);
    }

    public Iterable<LocalEntity> getAll()
    {
        return repo.findAll();
    }
}

已经折磨我一段时间了:),非常感谢您的帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)