[英]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,如果您可以添加相关代码,那将很有价值。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 实体中有一个类型无效的属性:
UUID
,而数据库中的列是TEXT
或VARCHAR
。错误 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.