时间戳转换器在 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 被转换为整数数组 [重复]

Spring-Data-Rest 验证器

如何在 Spring-Data-Rest 中实现细粒度的访问控制?