时间戳转换器在 Spring Data Rest 中无法使用 Spanner
Posted
技术标签:
【中文标题】时间戳转换器在 Spring Data Rest 中无法使用 Spanner【英文标题】:Timestamp converter not working in Spring Data Rest with Spanner 【发布时间】:2020-03-23 01:33:06 【问题描述】:我正在尝试借助不工作的 Spring Data Rest 自定义转换器将字符串格式的输入时间戳转换为云时间戳。在理解为什么不调用自定义转换器方面需要帮助。
输入:http://localhost:8080/apipromocentral/promotions RequestBody : "startDateTime": "2019-11-07 15:53:00"
POJO:
@ApiModel
@Data
@AllArgsConstructor
@Table(name = "PROMOTIONS")
public class Promotion
/**
* promotion id
*/
@ApiModelProperty(notes = "Id of the Promotion", required = true)
@PrimaryKey
@Column(name = "PROMO_ID")
private String promotionId;
@ApiModelProperty(notes = "Start Date Time of a promotion", allowableValues="yyyy-MM-dd HH:mm:ss", required = true)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@Column(name = "START_DATE_TIME")
private Timestamp startDateTime; //java.sql.timestamp;
converter code
@Component
public class TimestampWriteConverter implements Converter<java.sql.Timestamp, Timestamp>
@Override
public Timestamp convert(java.sql.Timestamp sqlTimestamp)
//Return com.google.cloud.Timestamp;
return Timestamp.of(sqlTimestamp);
异常 "message": "FAILED_PRECONDITION: com.google.api.gax.rpc.FailedPreconditionException: io.grpc.StatusRuntimeException: FAILED_PRECONDITION: 表 PROMOTIONS 中列 START_DATE_TIME 的值无效:预期的 TIMESTAMP。", “trace”:“com.google.cloud.spanner.SpannerException:FAILED_PRECONDITION:com.google.api.gax.rpc.FailedPreconditionException:io.grpc.StatusRuntimeException:FAILED_PRECONDITION:表PROMOTIONS中START_DATE_TIME列的值无效:预期的TIMESTAMP。\ r\n\tat com.google.cloud.spanner.SpannerExceptionFactory.newSpannerExceptionPreformatted(SpannerExceptionFactory.java:156)\r\n\tat com.google.cloud.spanner.SpannerExceptionFactory.newSpannerException(SpannerExceptionFactory.java:45)\r\ n\tat com.google.cloud.spanner.SpannerExceptionFactory.newSpannerException(SpannerExceptionFactory.java:112)\r\n\tat
【问题讨论】:
QQ:你有没有把这个转换器传递给一个ConverterAwareMappingSpannerEntityProcessor,然后它必须作为一个@Bean 用于SpannerEntityProcessor?见docs.spring.io/spring-cloud-gcp/docs/1.1.0.M1/reference/html/…13.2.10 【参考方案1】:查看文档,您似乎需要将 TimestampWriteConverter 转换器传递给 ConverterAwareMappingSpannerEntityProcessor。
@Configuration
public class ConverterConfiguration
@Bean
public SpannerEntityProcessor spannerEntityProcessor(SpannerMappingContext spannerMappingContext)
return new ConverterAwareMappingSpannerEntityProcessor(spannerMappingContext,
Arrays.asList(new TimestampWriteConverter()),
Arrays.asList());
【讨论】:
嗨 Fuad Malikov,我确实为时间戳转换器注册了读取器和写入器,但它不起作用。我还尝试将 start_date_time 标记为字符串,并尝试使用字符串到云时间戳和云时间戳到字符串转换器,但效果不佳。 但是我想在这里提供一个额外的输入:POJO to a String 和 String to a POJO 工作正常,没有任何问题。但是这里 String to Timestamp 或 sql.Timestamp to cloud.Timestamp 转换器不起作用。 感谢@GopalGowda 的输入。我已经在内部升级了它,看起来它可能是一个错误。我们目前正在努力。请继续关注。 此问题现已在github.com/spring-cloud/spring-cloud-gcp/pull/2065 中得到修复。请尝试 1.3.0.BUILD-SNAPSHOT。我们还将修复应用到 1.2.x 分支。以上是关于时间戳转换器在 Spring Data Rest 中无法使用 Spanner的主要内容,如果未能解决你的问题,请参考以下文章
spring-rest接口LocalDateTime转时间戳
spring-rest接口LocalDateTime转时间戳
在 spring-data-rest HAL _links 中将 UUID 编码更改为 base-32
使用 Spring Boot Rest 转换为 JSON 时,Java LocalDateTime 被转换为整数数组 [重复]