Spring boot 如果POJO的键是复合键,则Spring数据Cassandra不映射JSON请求
我正在尝试保存对Data Stax Cassandra的请求。 组件: EventController:@RestEndPoint OneKeyClass:用于复杂键(具有多列) 我使用标准的Spring存储库模型来保存和获取数据Spring boot 如果POJO的键是复合键,则Spring数据Cassandra不映射JSON请求,spring-boot,spring-data,spring-data-cassandra,spring-boot-test,Spring Boot,Spring Data,Spring Data Cassandra,Spring Boot Test,我正在尝试保存对Data Stax Cassandra的请求。 组件: EventController:@RestEndPoint OneKeyClass:用于复杂键(具有多列) 我使用标准的Spring存储库模型来保存和获取数据 Gradle: plugins { id "org.springframework.boot" version "1.5.3.RELEASE" } apply plugin: 'java' jar { baseName = 'sample-boot
Gradle:
plugins {
id "org.springframework.boot" version "1.5.3.RELEASE"
}
apply plugin: 'java'
jar {
baseName = 'sample-boot-with-cassandra'
version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-cassandra')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.kafka:spring-kafka')
compile('org.springframework.kafka:spring-kafka-test')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
控制器:
存储库:
EventKey
包com.company.employee.model
import java.io.Serializable;
import org.springframework.cassandra.core.Ordering;
import org.springframework.cassandra.core.PrimaryKeyType;
import org.springframework.data.cassandra.mapping.PrimaryKeyClass;
import org.springframework.data.cassandra.mapping.PrimaryKeyColumn;
@PrimaryKeyClass
public class EventKey implements Serializable {
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("EventKey [eventsource=").append(eventsource).append(", eventid=").append(eventid)
.append(", eventstate=").append(eventstate).append("]");
return builder.toString();
}
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + eventid;
result = prime * result + ((eventsource == null) ? 0 : eventsource.hashCode());
result = prime * result + ((eventstate == null) ? 0 : eventstate.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EventKey other = (EventKey) obj;
if (eventid != other.eventid)
return false;
if (eventsource == null) {
if (other.eventsource != null)
return false;
} else if (!eventsource.equals(other.eventsource))
return false;
if (eventstate == null) {
if (other.eventstate != null)
return false;
} else if (!eventstate.equals(other.eventstate))
return false;
return true;
}
public String getEventsource() {
return eventsource;
}
public void setEventsource(String eventsource) {
this.eventsource = eventsource;
}
public EventKey(String eventsource, int eventid, String eventstate) {
super();
this.eventsource = eventsource;
this.eventid = eventid;
this.eventstate = eventstate;
}
public int getEventid() {
return eventid;
}
public void setEventid(int eventid) {
this.eventid = eventid;
}
public String getEventstate() {
return eventstate;
}
public void setEventstate(String eventstate) {
this.eventstate = eventstate;
}
@PrimaryKeyColumn(name="eventsource",ordinal=0,type=PrimaryKeyType.PARTITIONED)
private String eventsource;
@PrimaryKeyColumn(name="eventid",ordinal=1,type=PrimaryKeyType.CLUSTERED,ordering=Ordering.ASCENDING)
private int eventid;
@PrimaryKeyColumn(name="eventstate",ordinal=2,type=PrimaryKeyType.CLUSTERED,ordering=Ordering.ASCENDING)
private String eventstate;
}
错误:
java.lang.IllegalArgumentException:目标bean不能为null强>
保存eventEvent[eventKey=null,transactionstatus=success]
传入有效载荷:
{
"eventsource" : "terminal",
"eventid": "23232",
"eventstate" : "CI",
"transactionstatus" : "success"
}
我跟着
提前感谢您的帮助。JSON负载与您的对象结构不匹配。您的JSON表示应该更匹配:
{
"eventKey": {
"eventsource" : "terminal",
"eventid": "23232",
"eventstate" : "CI"
},
"transactionstatus" : "success"
}
或者,您可以将
EventKey
内联到Event
中,或者使用两种不同的数据结构,一种用于API,另一种用于在Cassandra中存储和查询数据。IMHO拆分责任是保持事物解耦的更好选择,尽管使用相同类型通过API表示数据,并且以持久形式表示数据需要更少的代码,并且不需要映射。请包含完整的堆栈跟踪。请查找pastebin是的。这是真的。我给出了错误的json。而且两个POJO都需要默认值否则jackosn将无法将json映射到类
package com.company.employee.model;
import org.springframework.data.cassandra.mapping.Column;
import org.springframework.data.cassandra.mapping.PrimaryKey;
import org.springframework.data.cassandra.mapping.Table;
@Table(value="event")
public class Event {
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Event [eventKey=").append(eventKey).append(", transactionstatus=").append(transactionstatus)
.append("]");
return builder.toString();
}
@PrimaryKey
private EventKey eventKey;
public EventKey getEventKey() {
return eventKey;
}
public void setEventKey(EventKey eventKey) {
this.eventKey = eventKey;
}
public String getTransactionstatus() {
return transactionstatus;
}
public void setTransactionstatus(String transactionstatus) {
this.transactionstatus = transactionstatus;
}
@Column(value="transactionstatus")
private String transactionstatus;
}
import java.io.Serializable;
import org.springframework.cassandra.core.Ordering;
import org.springframework.cassandra.core.PrimaryKeyType;
import org.springframework.data.cassandra.mapping.PrimaryKeyClass;
import org.springframework.data.cassandra.mapping.PrimaryKeyColumn;
@PrimaryKeyClass
public class EventKey implements Serializable {
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("EventKey [eventsource=").append(eventsource).append(", eventid=").append(eventid)
.append(", eventstate=").append(eventstate).append("]");
return builder.toString();
}
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + eventid;
result = prime * result + ((eventsource == null) ? 0 : eventsource.hashCode());
result = prime * result + ((eventstate == null) ? 0 : eventstate.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EventKey other = (EventKey) obj;
if (eventid != other.eventid)
return false;
if (eventsource == null) {
if (other.eventsource != null)
return false;
} else if (!eventsource.equals(other.eventsource))
return false;
if (eventstate == null) {
if (other.eventstate != null)
return false;
} else if (!eventstate.equals(other.eventstate))
return false;
return true;
}
public String getEventsource() {
return eventsource;
}
public void setEventsource(String eventsource) {
this.eventsource = eventsource;
}
public EventKey(String eventsource, int eventid, String eventstate) {
super();
this.eventsource = eventsource;
this.eventid = eventid;
this.eventstate = eventstate;
}
public int getEventid() {
return eventid;
}
public void setEventid(int eventid) {
this.eventid = eventid;
}
public String getEventstate() {
return eventstate;
}
public void setEventstate(String eventstate) {
this.eventstate = eventstate;
}
@PrimaryKeyColumn(name="eventsource",ordinal=0,type=PrimaryKeyType.PARTITIONED)
private String eventsource;
@PrimaryKeyColumn(name="eventid",ordinal=1,type=PrimaryKeyType.CLUSTERED,ordering=Ordering.ASCENDING)
private int eventid;
@PrimaryKeyColumn(name="eventstate",ordinal=2,type=PrimaryKeyType.CLUSTERED,ordering=Ordering.ASCENDING)
private String eventstate;
}
{
"eventsource" : "terminal",
"eventid": "23232",
"eventstate" : "CI",
"transactionstatus" : "success"
}
{
"eventKey": {
"eventsource" : "terminal",
"eventid": "23232",
"eventstate" : "CI"
},
"transactionstatus" : "success"
}