我已经创建了一个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)中的代码:
@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):
@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);
}
现在,我尊敬的同事发现的快速解决办法是移动:
@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实现之前的提交。
发布于 2017-07-18 09:10:36
引用@Damien的评论:
我没有基于这个jira - github.com/spring-projects/spring-boot/issues/9756.将版本更改为2.0.BUILD-快照解决了这个问题。-达米安
springBootVersion =‘2.0.0.BUILD-快照’解决了这个问题。
https://stackoverflow.com/questions/45169166
复制