0

Ich habe alle Cassandra in einzelne Klasse verschoben. Als ich versuchte Instanz CassandraOperations im Hörer Gemfire Cache erstellen wurde immer Null-Zeiger exception.Can Sie mir bitte zu diesem Fehler helfenNull-Zeiger-Ausnahme mit Autowired Annotation - Gemfire Listerner

Ich habe jede Null-Zeiger-Ausnahme nicht empfangen mit Feder und Cassandra aber immer während mit Gemfire zu integrieren.

@Component 
public class CacheListener<K, V> extends CacheListenerAdapter<K, V> implements Declarable { 

@Autowired 
private CassandraOperations cassandraOperations; 

@Override 
public void init(Properties props) { 

} 

public void afterCreate(EntryEvent e) { 
    cassandraOperations.insert(e.getNewValue()); 

} 

@Override 
public void close() { 
} 

} 



public class CassandraConfig { 
@Autowired 
private Environment environment; 
private static final Logger LOGGER = LoggerFactory.getLogger(CassandraConfig.class); 
@Bean 
public CassandraClusterFactoryBean cluster() { 
    CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean(); 
    cluster.setContactPoints(environment.getProperty("cassandra.contactpoints")); 
    cluster.setPort(Integer.parseInt(environment.getProperty("cassandra.port"))); 
    return cluster; 
} 
@Bean 
public CassandraMappingContext mappingContext() { 
    BasicCassandraMappingContext mappingContext = new BasicCassandraMappingContext(); 
    mappingContext.setUserTypeResolver(new SimpleUserTypeResolver(cluster().getObject(), environment.getProperty("cassandra.keyspace"))); 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(environment.getProperty("cassandra.keyspace")); 
    session.setConverter(converter()); 
    session.setSchemaAction(SchemaAction.NONE); 
    return session; 
} 
@Bean 
public CassandraOperations cassandraTemplate() throws Exception { 
    return new CassandraTemplate(session().getObject()); 
} 
} 

Exception

[error 2017/05/05 11:16:04.874 CDT <http-nio-7878-exec-1> tid=0x5b] Exception occurred in CacheListener 
java.lang.NullPointerException 
    at CacheListener.afterCreate(CacheListener.java:27) 
    at com.gemstone.gemfire.internal.cache.EnumListenerEvent$AFTER_CREATE.dispatchEvent(EnumListenerEvent.java:97) 
    at com.gemstone.gemfire.internal.cache.LocalRegion.dispatchEvent(LocalRegion.java:8897) 
    at com.gemstone.gemfire.internal.cache.LocalRegion.dispatchListenerEvent(LocalRegion.java:7376) 
    at com.gemstone.gemfire.internal.cache.LocalRegion.invokePutCallbacks(LocalRegion.java:6158) 
    at com.gemstone.gemfire.internal.cache.EntryEventImpl.invokeCallbacks(EntryEventImpl.java:1919) 
    at com.gemstone.gemfire.internal.cache.ProxyRegionMap$ProxyRegionEntry.dispatchListenerEvents(ProxyRegionMap.java:548) 
    at com.gemstone.gemfire.internal.cache.LocalRegion.basicPutPart2(LocalRegion.java:6012) 
    at com.gemstone.gemfire.internal.cache.ProxyRegionMap.basicPut(ProxyRegionMap.java:232) 
    at com.gemstone.gemfire.internal.cache.LocalRegion.virtualPut(LocalRegion.java:5824) 
    at com.gemstone.gemfire.internal.cache.LocalRegionDataView.putEntry(LocalRegionDataView.java:118) 
    at com.gemstone.gemfire.internal.cache.LocalRegion.basicPut(LocalRegion.java:5214) 
    at com.gemstone.gemfire.internal.cache.LocalRegion.validatedPut(LocalRegion.java:1597) 
    at com.gemstone.gemfire.internal.cache.LocalRegion.put(LocalRegion.java:1580) 
    at com.gemstone.gemfire.internal.cache.AbstractRegion.put(AbstractRegion.java:327) 
    at org.springframework.data.gemfire.GemfireTemplate.put(GemfireTemplate.java:189) 
    at org.springframework.data.gemfire.repository.support.SimpleGemfireRepository.save(SimpleGemfireRepository.java:84) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
+0

Mögliches Duplikat [Was für eine Nullpointer ist, und wie kann ich es beheben?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how -do-i-fix-it) –

+0

Es gibt keine Ausnahme zwischen Cassandra und Feder. Instanz von Cassandra Operation erstellt nicht in Gemfire listner – Vigneshwaran

+0

Dies ist kein Duplikat – Vigneshwaran

Antwort

-1

Was nicht sichtbar in Ihrem Code ist/Konfiguration oben ist, wie Sie Ihre applikationsspezifische konfiguriert, GemFire ​​CacheListenerFrühling (Daten GemFire ​​) verwenden.

Ich sehe Sie Ihre Anwendung@Component Stereo-Typenannotation CacheListener mit Spring kommentierte, aber das tut nichts ohne Hilfe.

Verwenden Sie Classpath component scanning Funktionalität Frühling oder vielleicht Annotation-based container configuration Unterstützung der Frühling? Wenn Sie den späteren verwenden, wissen Sie, dass Sie Ihre Anwendung CacheListener in Config (JavaConfig oder XML) noch explizit definieren müssen, richtig?

Jedes Mal, wenn Sie ein NullPointerException auf einem Feld @Autowired Komponente/Mitarbeiter begegnen eine Abhängigkeit zu injizieren, vor allem, wenn Spring@Autowired Anmerkung, ist es guter Indikator ein Konfigurationsproblem hat, zumal die @Autowired Anmerkung, dass die „Abhängigkeit impliziert „(zB CassandraOperations) ist“ "erforderlich (es sei denn, Sie explizit die required Attribut der @Autowired Anmerkung zu falsch gesetzt, was Sie nicht haben; required standardmäßig wahr).

Wenn daher die CacheListener Komponenten wurden in der Scan aufgenommen und eine Abhängigkeit nicht injiziert werden kann (Auto-Kabel), da keine (weitere) bean des angegebenen Typs (zB CassandraOperations) in der Feder Anwendung definiert wurde Kontext (was es ist), dann Spring würde eine Exception werfen, wenn Sie Ihre Konfigurationsklasse (n) auswerten.

Obwohl, auch Ihre CassandraConfig Klasse muss auch mit Spring@Configuration Anmerkung oder mit der @Component Anmerkung kommentiert werden, wenn entweder Frühling Classpath Komponente Scannen oder Annotation-basierten Container config. Oder es muss explizit als Bean im Anwendungskontext Spring definiert werden, wenn keiner von beiden verwendet wird.

HINWEIS: Die Namenskonvention (d. H. CacheListener) ist nicht sehr gut, da sie mit GemFires eigener CacheListener Schnittstelle kollidiert.Es wäre besser, Ihre anwendungsspezifische Erweiterung/Implementierung vielleicht zu nennen, „GemFireToCassandraCacheListener

Als Beispiel ...

import ...; 

@Configuration 
class GemFireConfiguration { 

    @Bean 
    CacheFactoryBean gemfireCache() { 
    return new CacheFactoryBean(); 
    } 

    @Bean("CassandraCache") 
    PartitionedRegionFactoryBean cassandraCacheRegion() { 
    PartitionedRegionFactoryBean cassandraCacheRegion = 
     new PartitionedRegionFactoryBean(); 

    cassandraCacheRegion.setCache(gemfireCache()); 
    cassandraCacheRegion.setClose(false); 
    cassandraCacheRegion.setCacheListeners(
     new CacheListener[] { gemfireToCassandraCacheListener() }); 

    return cassandraCacheRegion; 
    } 

    @Bean 
    GemFireToCassandraCacheListener gemfireToCassandraCacheListener() { 
    return new GemFireToCassandraCacheListener(); 
    } 
} 

import ...; 

@Configuration 
class CassandraConfig { 

    // what you have above 
} 

Ich habe viel GemFire ​​Konfigurationsbeispiele here, die GemFire ​​nativen Konfiguration zeigt mit Frühling (Data GemFire) config XML vs. JavaConfig vs. Anmerkungen, etc, etc.

Endlich ...

Technisch könnte es sein, besser, ein GemFire ​​CacheWriter, an die Region angeschlossen, anstatt eine CacheListener, da was Sie tun (Aktualisierung Cassandra auf einem Cache erstellen) ist der beabsichtigte Zweck eines CacheWriter.

Natürlich heißt die CacheListener"after" create gegenüber der CacheWriter, die "before" create ist. Ich würde jedoch sagen, es ist immer besser, die "primäre" Datenquelle (oder "Quelle der Wahrheit") zu aktualisieren, bevor Sie den "Cache" aktualisieren, um die Datenquelle widerzuspiegeln. Dies gilt insbesondere, wenn Einschränkungen in der primären Datenquelle vorliegen, die dazu führen können, dass ein Update fehlschlägt. Sie möchten nicht, dass der Cache aktualisiert wird, wenn die primäre Datenquelle nicht vorhanden sein kann.

A CacheWriter konfiguriert ist, ähnlich wie ein CacheListener, wie so ...

@Bean("CassandraCache") 
    PartitionedRegionFactoryBean cassandraCacheRegion() { 
    PartitionedRegionFactoryBean cassandraCacheRegion = 
     new PartitionedRegionFactoryBean(); 

    cassandraCacheRegion.setCache(gemfireCache()); 
    cassandraCacheRegion.setClose(false); 
    cassandraCacheRegion.setCacheWriter(gemfireToCassandraCacheWriter()); 

    return cassandraCacheRegion; 
    } 

    @Bean 
    GemFireToCassandraCacheWriter gemfireToCassandraCacheWriter(
     CassandraOperations cassandraOperations) { 

    return new GemFireToCassandraCacheWriter(cassandraOperations); 
    } 

Wo die GemFireToCassandraCacheWriter definiert werden würde ...

class GemFireToCassandraCacheWriter extends CacheWriterAdapter { 

    private CassandraOperations cassandraOperations; 

    // Using constructor injection is better than field injection 
    GemFireToCassandraCacheWriter(CassandraOperations cassandraOperations) { 
    this.cassandraOperations = cassandraOperations; 
    } 

    public void beforeCreate(EntryEvent<?, ?> event) { 
    cassandraOperations.insert(event.getNewValue()); 
    } 
} 

HINWEIS: eine Region kann nur 1 haben CacheWriter. FYI, funktional die CacheWriter ist das Gegenstück zu einem CacheLoader. Weitere Informationen finden Sie unter GemFire User Guide. Siehe insbesondere here, here und here.

Außerdem, wenn Sie nur verwenden GemFire ​​als Cache für Staat, der in erster Linie in Cassandra verwaltet wird, dann könnten Sie auch Spring's Cache Abstraction betrachten, für die Spring Data GemFire ​​positions GemFire als „Anbieter“ in der Abstraktion.

Nicht sicher, was Ihr GemFire ​​zu Cassandra UC ist, aber Denkanstoß.

Hoffe, das hilft!

-Johannes

Verwandte Themen