Spring boot 如果POJO的键是复合键,则Spring数据Cassandra不映射JSON请求

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

我正在尝试保存对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-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"
}