首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Spring的JsonMappingException :从映射的列表中删除@Id时选择错误的序列化程序

使用Spring的JsonMappingException :从映射的列表中删除@Id时选择错误的序列化程序
EN

Stack Overflow用户
提问于 2017-07-18 14:07:13
回答 1查看 703关注 0票数 0

我已经创建了一个gitlab项目(网址),在这里我希望使用Spring来持久化并公开一些传感器数据。在使用HAL浏览器进行测试时,坚持使用PostgreSQL DB没有问题,但SensorReading GET给我带来了一些麻烦:

无法写入JSON:不能将com.fasterxml.jackson.databind.JsonMappingException:转换为java.lang.Double;嵌套异常是java.lang.Double,不能将java.lang.Integer转换为java.lang.Double(通过引用链: org.springframework.hateoas.Resources\"_embedded\">java.util.Collections$UnmodifiableMap\"sensorReadings\">java.util.ArrayList>org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module$PersistentEntityResourceSerializer$1\"content\"->net.smurfz.kado.models.SensorReading\"sensorId\") )

my @Entity-class (net.smurfz.kado.models.SensorReading)中的代码:

代码语言:javascript
运行
复制
@Entity
public class SensorReading {

    @Id
    @org.springframework.data.annotation.Id
    @SequenceGenerator(name = "sensor_reading_id_seq",
            sequenceName = "sensor_reading_id_seq",
            allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
            generator = "sensor_reading_id_seq")
    @Column(updatable = false)
    private Integer id;

    @NotNull
    private Integer sensorId;

    @NotNull
    private double reading;

    @Column(name = "created_date")
    @ReadOnlyProperty
    private Date created;

    public SensorReading() {
    }

    public SensorReading(Integer sensorId, double reading) {
        this.sensorId = sensorId;
        this.reading = reading;
    }

    public Integer getId() {
        return id;
    }

    public Integer getSensorId() {
        return sensorId;
    }

    public void setSensorId(Integer sensorId) {
        this.sensorId = sensorId;
    }

    public double getReading() {
        return reading;
    }

    public void setReading(double reading) {
        this.reading = reading;
    }

    public Date getCreated() {
        return created;
    }

    @PrePersist
    protected void onCreate() {
        created = new Date();
    }
}

和我的@RepositoryRestResource-class (net.smurfz.kado.repositories.SensorReadingRepository):

代码语言:javascript
运行
复制
@RepositoryRestResource
public interface SensorReadingRepository extends CrudRepository<SensorReading, Integer> {
    List<SensorReading> findTop30BySensorIdOrderByCreatedDesc(Integer sensorId);
    Long countAllBySensorId(Integer sensorId);
    SensorReading findFirstBySensorIdOrderByCreatedDesc(Integer sensorId);
    Page<SensorReading> findAllBySensorId(Integer sensorId, Pageable pageable);
}

现在,我尊敬的同事发现的快速解决办法是移动:

代码语言:javascript
运行
复制
        @Id
        @org.springframework.data.annotation.Id
        @SequenceGenerator(name = "sensor_reading_id_seq",
                sequenceName = "sensor_reading_id_seq",
                allocationSize = 1)
        @GeneratedValue(strategy = GenerationType.SEQUENCE,
                generator = "sensor_reading_id_seq")
        @Column(updatable = false)
        private Integer id;

在所有其他字段声明下。

当BeanSerializerFactory-类试图定义要使用的序列化程序时,会发生此错误。我的工作理论是,它最初识别4个字段(列表4),然后过滤不序列化id (列表3),但决定使用第二个列表中的第一个列表中的索引(1-3),从而使Integer字段获得下面定义的双字段的序列化程序。

这是一种不应该被利用的肮脏的黑客行为,因为我不知道这可能会影响到什么,所以我想知道:

( a)为何会出现这种情况?

( b)为避免这一错误,应采取哪些不同的做法?

上面的URL直接链接到id-fix实现之前的提交。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-18 17:10:36

引用@Damien的评论:

我没有基于这个jira - github.com/spring-projects/spring-boot/issues/9756.将版本更改为2.0.BUILD-快照解决了这个问题。-达米安

springBootVersion =‘2.0.0.BUILD-快照’解决了这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45169166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档