2017-04-09 5 views
3

Ich habe versucht, eine Einfügung von einer Cassandra UDT zu testen, und ich laufe weiterhin in den folgenden Fehler: Ausnahme im Thread "main" java.lang.IllegalArgumentException: UserTypeResolver darf nicht null seinUserTypeResolver darf nicht null sein

nach nur versucht, meinen eigenen Weg durch, um einen Reim, ich versuchte genau den Ansatz in dem folgenden skizzierten zu replizieren: User Defined Type with spring-data-cassandra

aber ich bekomme immer noch den gleichen Fehler.

Ich bin in der Lage, in die Ziel-DB einfügen, wenn ich die UDT entfernen und einfach die einfachen Typen einfügen, damit ich weiß, dass ich richtig verbinde. Meine Konfiguration ist wie folgt:

@Configuration 
@PropertySource(value = { "classpath:cassandra.properties" }) 
//@EnableCassandraRepositories(basePackages = { "org.spring.cassandra.example.repo" }) 
public class CassandraConfig { 

private static final Logger LOG = LoggerFactory.getLogger(CassandraConfig.class); 

@Autowired 
private Environment env; 

@Bean 
public CassandraClusterFactoryBean cluster() { 

    CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean(); 
    cluster.setContactPoints(env.getProperty("cassandra.contactpoints")); 
    cluster.setPort(Integer.parseInt(env.getProperty("cassandra.port"))); 

    return cluster; 
} 

@Bean 
public CassandraMappingContext mappingContext() { 
    BasicCassandraMappingContext mappingContext = new BasicCassandraMappingContext(); 
    mappingContext.setUserTypeResolver(new SimpleUserTypeResolver(cluster().getObject(), "campaign_management")); 
    return mappingContext; 
} 

@Bean 
public CassandraConverter converter() { 
    return new MappingCassandraConverter(mappingContext()); 
} 

@Bean 
public CassandraSessionFactoryBean session() throws Exception { 

    CassandraSessionFactoryBean session = new CassandraSessionFactoryBean(); 
    session.setCluster(cluster().getObject()); 
    session.setKeyspaceName(env.getProperty("cassandra.keyspace")); 
    session.setConverter(converter()); 
    session.setSchemaAction(SchemaAction.NONE); 

    return session; 
} 

@Bean 
public CassandraOperations cassandraTemplate() throws Exception { 
    return new CassandraTemplate(session().getObject()); 
} 
} 

Meine Adresse und Mitarbeiterklassen sind genau wie in der Frage IREFERENZ oben SO gezeigt, und mein Haupt ist einfach:

public class MainClass { 

public static void main(String[] args) { 

ApplicationContext service = new AnnotationConfigApplicationContext(CassandraConfig.class); 

Employee employee = new Employee(); 
employee.setEmployee_id(UUID.randomUUID()); 
employee.setEmployee_name("Todd"); 
Address address = new Address(); 
address.setAddress_type("Home"); 
address.setId("ToddId"); 
employee.setAddress(address); 
CassandraOperations operations = service.getBean("cassandraTemplate", CassandraOperations.class); 

operations.insert(employee); 

System.out.println("Done"); 
} 
} 

Ich verwende:

datastax.cassandra.driver.version=3.1.3 
spring.data.cassandra.version=1.5.1 
spring.data.commons.version=1.13.1 
spring.cql.version=1.5.1 

Die Version, auf die in der vorherigen SO-Frage verwiesen wird, ist 1.5.0, obwohl spring.io 1.5.1 als aktuell auflistet, also verwende ich das, und keine 1.5.0 wird als verfügbar angezeigt.

Jede Hilfe wäre willkommen, da dies mich etwas verrückt macht.

+0

Sie müssen 'CassandraTemplate' mit' Session' und 'CassandraConverter' konstruieren. – mp911de

+0

Danke, ich bin neu in Spring, also hat mir dein Kommentar geholfen, in die richtige Richtung zu gehen. Habe es herausgefunden. – TBlank

+0

@TBlank Kannst du bitte deine Lösung veröffentlichen? – TechEnthusiast

Antwort

0

Sie erhalten in der Regel diesen Fehler, wenn Sie eine UserTypeResolver unter Ihrem cassandra Mapping verpassen, sich von der cassandra Converter verwendet wird, sich von der Spring Data Cassandra Vorlage

Für die Details verwendet:

Sie Angenommen Haben Sie einen grundlegenden Spring MVC Controller und läuft woanders ...

UserDefinedTypes in Cassandra am interessantesten in SETs und MAPs, das folgende Beispiel ist von solcher Art.

Beispiel Spring-Bean-Konfiguration mit allen Standardeinstellung (Spring-XML-Anwendungskontext Auszug):

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:cassandra="http://www.springframework.org/schema/data/cassandra" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:task="http://www.springframework.org/schema/task" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 
    http://www.springframework.org/schema/data/cassandra http://www.springframework.org/schema/data/cassandra/spring-cassandra.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> 
... 
<!-- ===== CASSANDRA ===== --> 
<!-- Loads the properties into the Spring Context and uses them to fill in placeholders in bean definitions below --> 
<context:property-placeholder location="/WEB-INF/spring/cassandra.properties" /> 

<!-- REQUIRED: The Cassandra Cluster --> 
<cassandra:cluster contact-points="${cassandra.contactpoints}" 
    port="${cassandra.port}" username="cassandra" password="cassandra" 
    auth-info-provider-ref="authProvider" /> 

<!-- REQUIRED: The Cassandra Session, built from the Cluster, and attaching to a keyspace --> 
<cassandra:session keyspace-name="${cassandra.keyspace}" /> 

<!-- REQUIRED: The Default Cassandra Mapping Context used by CassandraConverter 
    DO include a userTypeResolver for UDT support --> 
<cassandra:mapping entity-base-packages="fr.woobe.model"> 
    <cassandra:user-type-resolver keyspace-name="${cassandra.keyspace}" /> 
</cassandra:mapping> 

<!-- REQUIRED: The Default Cassandra Converter used by CassandraTemplate --> 
<cassandra:converter /> 

<bean id="authProvider" class="com.datastax.driver.core.PlainTextAuthProvider"> 
    <constructor-arg index="0" value="myCassandraUser" /> 
    <constructor-arg index="1" value="somePassword" /> 
</bean> 

<!-- REQUIRED: The Cassandra Template is the building block of all Spring Data Cassandra --> 
<cassandra:template id="cassandraTemplate" /> 
... 

und dann in Java, in der Regel in Ihrem Spring MVC-Controller:

import org.springframework.data.cassandra.core.CassandraOperations; 
... 
// acquire DB template 
CassandraOperations cOps = this.beanFactory.getBean("cassandraTemplate", CassandraOperations.class); 
// for instance: load everything 
List<MyData> rows = cOps.select("SELECT * FROM mydatatable", MyData.class); 
// assuming an entry with index i exists... 
Set<Pair> mySetOfPairs = rows.get(i).pairSet; 
if (mySetOfPairs!=null) 
    for (Pair p : mySetOfPairs) { 
     ... handle p.first and p.second ... 
... 

mit dieser Art von Unternehmen Zuordnungen:

package example.model; 
import java.util.Set; 
import org.springframework.data.cassandra.core.mapping.CassandraType; 
import org.springframework.data.cassandra.core.mapping.PrimaryKey; 
import org.springframework.data.cassandra.core.mapping.Table; 
import com.datastax.driver.core.DataType.Name; 

@Table public class MyData { 
    @PrimaryKey 
    public String myKey; 
    // some other basic fields... 
    public String moreStuff; 
    // a SET of user defined 'pair type' 
    @CassandraType(type = Name.SET, userTypeName = "pairType") 
    public Set<Pair> pairSet; 

    // your constructors and other methods here... 
} 

und eine benutzerdefinierte Entität wie:

package example.model; 
import org.springframework.data.cassandra.core.mapping.UserDefinedType; 

@UserDefinedType("pairType ") 
public class Pair { 
    public String first; 
    public String second; 

    public Pair() { 
    } 
    public Pair(String f, String s) { 
    this.first= f; 
    this.second= s; 
    } 
} 

all basierend auf einem Cassandra Tabelle erstellt wie:

CREATE TYPE pairType (first text, second text); 

CREATE TABLE MyData (
    myKey text, 
    moreStuff text, 
    pairSet set<frozen<pairType>>, 
    PRIMARY KEY (myKey) 
) ; 

INSERT INTO MyData (myKey, moreStuff, pairSet) 
    VALUES ('hello', 'world', { 
        { first:'one', second:'two' }, 
        { first:'out', second:'there' } } 
     ) ; 

Im Begriff von Maven Artefakte oder Bibliotheken, feder webmvc ist in der Tat erforderlich, wenn Sie in einem Web MVC Frühlings-Controller und dann Frühjahr laufen -Kontext-Unterstützung und Feder-Daten-Cassandra. Der DataStax-Cassandra-Treiber kommt als Abhängigkeit daher.

Verwandte Themen