繁体   English   中英

Cassandra Db 插入问题通过 springboot

[英]Cassandra Db insertion issue Via springboot

我正在尝试将值插入我的 Cassandra 数据库,但出现此错误。 在这里提到数据类型映射一切似乎都很好...... http://itdoc.hitachi.co.jp/manuals/3020/30203V0300e/BV030040.HTM

reactor.core.Exceptions$ErrorCallbackNotImplemented:com.datastax.oss.driver.api.core.type.codec.CodecNotFoundException:找不到请求操作的编解码器:[UUID <-> java.lang.String] 原因:88168970datatax708 .oss.driver.api.core.type.codec.CodecNotFoundException:找不到请求操作的编解码器:[UUID <-> java.lang.String]

这是实体 object

package com.sams.pricing.prism.data.processor.entity;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.cassandra.core.cql.PrimaryKeyType;
import org.springframework.data.cassandra.core.mapping.Column;
import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn;
import org.springframework.data.cassandra.core.mapping.Table;

import java.sql.Timestamp;

//import java.time.Instant;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@Table(value = "retail_lifecycle")
@EntityScan
@ToString
public class PricingLifeCycleEntity {

  @PrimaryKeyColumn(name = "itemnbr", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
  private Integer itemNbr;

  @PrimaryKeyColumn(name = "clubnbr", ordinal = 1, type = PrimaryKeyType.CLUSTERED)
  private Short locationNbr;

  @PrimaryKeyColumn(name = "price", ordinal = 2, type = PrimaryKeyType.PARTITIONED)
  private Double price;

  @PrimaryKeyColumn(name = "pricestartts", ordinal = 3, type = PrimaryKeyType.CLUSTERED)
  private Timestamp priceStartTs;

  @PrimaryKeyColumn(name = "status", ordinal = 4, type = PrimaryKeyType.PARTITIONED)
  private String status;

  @Column(value = "createts")
  private Timestamp createTs;

  @Column(value = "currency")
  private String currency;
  
  @Column(value = "lastupdatets")
  private Timestamp lastUpdateTs;
  
  @Column(value = "priceendts")
  private Timestamp priceEndTs;
  
  @Column(value = "pricereasoncode")
  private String priceReasonCode;
  
  @Column(value = "pricereasoncodedesc")
  private String priceReasonCodeDesc;
  
  @Column(value = "pricetype")
  private String priceType;
  
  @Column(value = "pricetypedesc")
  private String priceTypeDesc;
   
  @Column(value = "statusdesc")
  private String statusDesc;
  
  @Column(value = "submissionclient")
  private String submissionClient;

  @Column(value = "submissionts")
  private Timestamp submissionTs;

  @Column(value = "submissionuserid")
  private String submissionUserId;
  
  @Column(value = "uniqueid")
  private String uniqueId;
 
}

这里是数据库

CREATE TABLE cassandra.prism.retail_lifecycle (
    itemnbr INTEGER NOT NULL,
    clubnbr SMALLINT NOT NULL,
    price DOUBLE NOT NULL,
    pricestartts TYPE_TIMESTAMP NOT NULL,
    status VARCHAR NOT NULL,
    createts TYPE_TIMESTAMP,
    currency VARCHAR,
    lastupdatets TYPE_TIMESTAMP,
    priceendts TYPE_TIMESTAMP,
    pricereasoncode VARCHAR,
    pricereasoncodedesc VARCHAR,
    pricetype VARCHAR,
    pricetypedesc VARCHAR,
    statusdesc VARCHAR,
    submissionclient VARCHAR,
    submissionts TYPE_TIMESTAMP,
    submissionuserid VARCHAR,
    uniqueid VARCHAR,
    CONSTRAINT RETAIL_LIFECYCLE_PK PRIMARY KEY (itemnbr,clubnbr,price,pricestartts,status)

这是测试用例

@Test
  public void test2() throws Exception {
    MockEndpoint mock =
        camelContext.getEndpoint("mock:" + Endpoints.SEDA_PROCESS_ENDPOINT, MockEndpoint.class);

    AdviceWith.adviceWith(
        camelContext,
        Endpoints.SEDA_SEND_ENDPOINT,
        // intercepting an exchange on route
        r -> {
          // replacing consumer with direct component
          r.replaceFromWith(Endpoints.SEDA_SEND_ENDPOINT);
          // mocking producer
          r.mockEndpoints("seda*");

          // weaving a last step to your route that will redirect the message to mock:result
          r.weaveAddLast().to(mock);
        });
    
    var eventId = UUID.randomUUID().toString();
    
    System.out.println("hereeeee "+eventId );
    String message = "{\"itemNbr\":8831,\"locationNbr\":4707,\"price\":55.0,\"priceStartTs\":\"2022-11-11T03:24:14.749Z\",\"status\":\"SUCCESS\",\"createTs\":\"2022-11-11T03:24:14.749Z\",\"currency\":\"USD\",\"lastUpdateTs\":\"2022-11-11T03:24:14.749Z\",\"priceEndTs\":\"2022-11-11T03:24:14.749Z\",\"priceReasonCode\":\"TEST\",\"priceReasonCodeDesc\":\"TEST\",\"priceType\":\"TST\",\"priceTypeDesc\":\"TST\",\"statusDesc\":\"TST\",\"submissionClient\":\"TST\",\"submissionTs\":\"2022-11-11T03:24:14.749Z\",\"submissionUserId\":\"TST\",\"uniqueId\":\"121212111212112121212121\"}";


    // setting expectations
    mock.expectedMessageCount(1);

    Map<String, Object> headers = new HashMap<>();
    headers.put(PrismConstants.APP_NAME, PrismConstants.PRICING_LIFE_CYCLE_APP_NAME);
    headers.put(PrismConstants.EVENT_ID, UUID.randomUUID().toString());

    // invoking consumer
    // we are going to send as a Json body object
    producerTemplate.sendBodyAndHeaders(
        Endpoints.SEDA_SEND_ENDPOINT,
        message,
        headers);

    // asserting mock is satisfied
    mock.assertIsSatisfied();
    var result = mock.getExchanges().get(0).getIn();
    System.out.println(result.getBody().toString());
  }

编辑 - 数据库信息和模式更新

主键实体 class

package com.sams.pricing.prism.data.processor.entity;

import lombok.*;
import org.springframework.data.cassandra.core.cql.PrimaryKeyType;
import org.springframework.data.cassandra.core.mapping.PrimaryKeyClass;
import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn;

import java.sql.Timestamp;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@PrimaryKeyClass
@ToString
public class PricingLifeCyclePrimaryKey {

    @PrimaryKeyColumn(name = "itemnbr", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    private Integer itemNumber;

    @PrimaryKeyColumn(name = "clubnbr", ordinal = 1, type = PrimaryKeyType.CLUSTERED)
    private Short locationNumber;

    @PrimaryKeyColumn(name = "price", ordinal = 2, type = PrimaryKeyType.PARTITIONED)
    private Double price;

    @PrimaryKeyColumn(name = "pricestartts", ordinal = 3, type = PrimaryKeyType.CLUSTERED)
    private Timestamp pricestartTs;

    @PrimaryKeyColumn(name = "status", ordinal = 4, type = PrimaryKeyType.PARTITIONED)
    private String status;


}

主键的模式代码

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

请注意:

  • 在您的test2中,您从未使用过 Cassandra,如果您可以添加相关代码,那将很有价值。
  • 表架构仍然不清楚,因为您可能共享 JDBC 工具的屏幕截图。 最好的方法是使用 cqlsh 获取describe table retail_lifecycle的 output 以获得详细的架构。

错误 1:CodecNotFoundException

reactor.core.Exceptions$ErrorCallbackNotImplemented: 
com.datastax.oss.driver.api.core.type.codec.CodecNotFoundException: 
Codec not found for requested operation: [UUID <-> java.lang.String]...

此消息意味着在您的 Java 实体中有一个类型无效的属性:

  • java 字段是UUID ,而数据库中的列是TEXTVARCHAR
  • 或 java 字段为字符串,预期列为 UUID。

错误 2:InvalidQueryException

table retail_lifecycle does not exist; nested exception is com.datastax.oss.driver.api.core.servererrors.InvalidQueryException: table retail_lifecycle does not exist

此消息告诉您要写入的表不存在。 retail_lifecycle根本不存在,或者您可能没有在CqlSession定义中提供键空间。

通过手动发送事件 ID 修复了它,但现在收到此错误 - 看起来像是类型不匹配。

reactor.core.Exceptions$ErrorCallbackNotImplemented: org.springframework.data.cassandra.CassandraInvalidQueryException: ReactivePreparedStatementCallback; CQL [INSERT INTO retail_lifecycle (itemnbr,price,status,clubnbr,pricestartts,createts,currency,lastupdatets,priceendts,pricereasoncode,pricereasoncodedesc,pricetype,pricetypedesc,statusdesc,submissionclient,submissionts,submissionuserid,uniqueid) VALUES (?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)]; 表 retail_lifecycle 不存在; 嵌套的异常是 com.datastax.oss.driver.api.core.servererrors.InvalidQueryException:表 retail_lifecycle 不存在引起:org.springframework.data.cassandra.CassandraInvalidQueryException:ReactivePreparedStatementCallback; CQL [INSERT INTO retail_lifecycle (itemnbr,price,status,clubnbr,pricestartts,createts,currency,lastupdatets,priceendts,pricereasoncode,pricereasoncodedesc,pricetype,pricetypedesc,statusdesc,submissionclient,submissionts,submissionuserid,uniqueid) VALUES (?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)]; 表 retail_lifecycle 不存在; 嵌套异常是 com.datastax.oss.driver.api.core.servererrors.InvalidQueryException:表 retail_lifecycle 不存在

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM