So verlängern Sie die SimpleMongoRepository von spring-data mongodb?
Ich versuche zu erstellen BaseDAO-Schnittstelle, die erweitert werden kann, indem alle DAOs. Das Projekt verwendet ein spring-Daten mit mongodb. Das problem ist, dass wenn ich alle die einzelnen DAOs zu erweitern MongoRepository und nicht schreiben, der eine Implementierung der Klasse, dann funktioniert alles einwandfrei. Aber wenn ich versuche, um die MongoRepository der BaseDAO Schnittstelle mit Generika, die app funktioniert nicht mehr, weil die erforderlichen Parameter zu instanziieren SimpleMongoRepository null sind. Dies ist der code den ich bisher :
BaseDAO.java
import com.test.mongodb.BaseEntity;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.NoRepositoryBean;
import java.io.Serializable;
@NoRepositoryBean
public interface BaseDAO<T extends BaseEntity, ID extends Serializable> extends MongoRepository<T, ID> {
public T getTestObject(ID id);
}
BaseDAOImpl.java
import com.test.mongodb.BaseEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.repository.query.EntityInformationCreator;
import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
import org.springframework.data.repository.NoRepositoryBean;
import java.io.Serializable;
@NoRepositoryBean
public class BaseDAOImpl<T extends BaseEntity, ID extends Serializable> extends SimpleMongoRepository<T,
ID> implements BaseDAO<T, ID> {
@Autowired
private static MongoTemplate mongoTemplate;
@Autowired
private static EntityInformationCreator entityInformationCreator;
public BaseDAOImpl(Class<T> type){
super((MongoEntityInformation<T, ID>) entityInformationCreator.getEntityInformation(type), mongoTemplate);
}
@Override
public T getTestObject(ID id){
return findOne(id);
}
}
UserDAO.java
import com.test.mongodb.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserDAO extends BaseDAO<User, String> {}
UserDAOImpl.java
import com.test.mongodb.User;
import org.springframework.stereotype.Repository;
@Repository
public class UserDAOImpl extends BaseDAOImpl<User, String> implements UserDAO {
public UserDAOImpl(){
super(User.class);
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.1.xsd">
<!-- MongoFactoryBean instance -->
<mongo:mongo host="localhost" port="27017" />
<mongo:db-factory dbname="bank" mongo-ref="mongo" />
<!-- MongoTemplate instance -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
</bean>
<bean id="mappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
<bean id="entityInformationCreator" class="org.springframework.data.mongodb.repository.support.DefaultEntityInformationCreator">
<constructor-arg name="mappingContext" ref="mappingContext" />
</bean>
<mongo:repositories base-package="com.test.mongodb.repo"/>
</beans>
App.java
public class App {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserRepository userRepository = context.getBean("userRepository", UserRepository.class);
User user = new User("Test User");
userRepository.save(user);
String id = user.getId();
System.out.println(id);
System.out.println(userRepository.getTestObject(user.getId()));
}
}
Also bei mir läuft es, ich bekomme eine NPE in BaseDAOImpl, da sowohl die mongoTemplate und die entityInformationCreator null sind. Wie lade ich Sie? Ich schaute auf die Feder MongoDB-Referenz Dokument aber meist sagt, Folgen Sie der Dokumentation, die für andere Art von repositories. Das einzige, was ich finden konnte, die dort und an anderen Orten online war, um eine Fabrik bean. Also ich habe versucht das so gut mit :
MongoRepoFactoryBean.java
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.support.MongoRepositoryFactory;
import org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.core.support.RepositoryFactorySupport;
import java.io.Serializable;
@NoRepositoryBean
public class MongoRepoFactoryBean<T extends MongoRepository<?,?>, ID extends
Serializable> extends MongoRepositoryFactoryBean {
protected RepositoryFactorySupport createRepositoryFactory(Class<T> clazz, MongoTemplate mongoTemplate) {
return new MongoRepoFactory(clazz, mongoTemplate);
}
private static class MongoRepoFactory extends MongoRepositoryFactory {
private Class clazz;
private MongoTemplate mongoTemplate;
public MongoRepoFactory(Class clazz, MongoTemplate mongoTemplate) {
super(mongoTemplate);
this.mongoTemplate = mongoTemplate;
this.clazz = clazz;
}
public Object getTargetRepository() {
return new BaseDAOImpl(clazz);
}
public Class<?> getRepositoryBaseClass() {
return BaseDAOImpl.class;
}
}
}
verändert und die applicationContext.xml mit :
<mongo:repositories base-package="com.test.mongodb.repo"
factory-class="com.test.mongodb.repo.MongoRepoFactoryBean"/>
Aber das funktioniert auch nicht. Ich habe versucht, mit JavaConfig als gut, aber ich weiß nicht, wie die factory-Klasse, wenn dabei die Konfiguration mit Annotationen. Was mache ich falsch? SimpleMongoRepository nicht kommen mit einem Standard-Konstruktor. Ist das problem in Injektion statische Felder?
InformationsquelleAutor imgr8 | 2013-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Referenz-Dokumentation ist veraltet, nicht die änderungen an der spring-data-mongodb 1.1.1.RELEASE.
Ich hatte das gleiche problem wie du, ist hier, wie ich Abhilfe-ed.
Hinweis, dass ich mit beiden MongoConfig Klasse-und app-XML-Kontext, aber Sie wirklich nicht brauchen, ich habe gerade beschlossen, es so zu tun, veranschaulichen Ihre Verwendung.
MongoConfig Klasse: (Sie können dies auch über Feder-app-Kontext-XML)
Frühling App-Kontext-XML:
Meine repository - /dao-Klasse:
Ich weiß, das ist wirklich unschön und funktioniert nur mit Java 6, aber da der Rückgabetyp von getEntityInformation() ist völlig Grenzenlos, es ist entweder das, oder haben die ID-Typ Serialisierbar sein, statt von Ihrem tatsächlichen Typ ID und tun die explizite Umwandlung jedes mal, wenn Sie es brauchen.
Ich wünschte, es war ein sauberer Weg, aber ich habe dich schon einige Zeit über die API und sogar den Quellcode und habe nicht herausgefunden, Sie einen besseren Weg, es zu tun, ohne coming up mit Ihrem eigenen Implementierung des spring-data-mongodb-Klassen.
Hoffe, es hilft.
Kannst du die Fehlermeldung oder stacktrace?
Ich bekomme
NoSuchBeanDefenitionException
im Konstruktor obwohl ich ein dbFactory in meiner config xmlInformationsquelleAutor Russell
Schrieb ich eine erweiterbare Daten-Zugriffs-Bibliothek für Frühjahr und MongoDB für den Frühling web-Anwendungen (MVC) mit MongoTemplate aber völlig zu vermeiden auto-Verdrahtungs-und Repository. Es hat die lose Kopplung (mit Werkseinstellungen) zwischen Controller und Daten-layer. Sie können hinzufügen, mehr Basis-Daten-Methoden in der Basis-Implementierung, die andere domain-Objekte Erben automatisch. Sehen https://github.com/rameshpa/spring-mongodb
InformationsquelleAutor rameshpa
Stellen Sie sicher, Folgen Sie den Anweisungen in der die Referenz-Dokumentation. Es gibt kein autowiring hier passiert, wie haben Sie das erstellen der Instanz des repository-Basis-Klasse in Ihrem MongoRepositoryFactory (sollte es eine andere Methode zu überschreiben, die habe ich nicht im Kopf jetzt, ich will hinzufügen, dass später, aber Sie vielleicht überfliegen Sie die super-Klasse' Javadoc in der Zwischenzeit). Im Allgemeinen, field injection ist nicht eine gute Idee, aus architektonischen Gründen und Injektion in statischen Feldern ist noch schlimmer :).
<mongo:repositories base-package="com.test.mongodb.repo" factory-class="com.test.mongodb.repo.MongoRepoFactoryBean"/>
Sorry, ich habe nur Magermilch, um Ihre XML-config und dachte, das war es, der werkseitigen Konfiguration scheint, wurden die gerundeten, indem der code fließt aus dem text-Feld. Passte meine Antwort.
InformationsquelleAutor Oliver Drotbohm
Fixiert es mit
<mongo:mapping-converter id="..." base-package="..." />
, und stellte sicher, dass daneben alle meine persistenten Klassen mit@Document
Anmerkung, auch wenn Sie nicht über eine eigene Sammlung.InformationsquelleAutor Russell
Geeignete Lösung für das 'Hinzufügen benutzerdefinierter Verhalten auf alle repositories mit spring-data mongodb wird detailliert in diesem post.
Nachdem Sie die Schritte im obigen post, Sie können eine beliebige repository-Schnittstelle zu erweitern, die custom-shared-repository-Schnittstelle wie unten
Die Umsetzung in WootideRepositoryImpl verfügbar sein wird in CustomerRepository.
Es funktioniert so gut für mich.
InformationsquelleAutor Subhu.rys