Spring 向所有没有xml配置的存储库添加自定义行为
我试图向spring应用程序中的所有存储库添加自定义行为,但我不想使用XML配置,只想使用spring注释,如@xxxx 所以我在互联网上寻找,我发现了。 文档的问题在于它处理的是JPA(不是MongoDB),步骤4对于没有xml注释的spring应用程序来说不够具体 文件编制第4步: 直接声明自定义工厂的bean 我们如何做到这一点 所以我没有放弃,我在互联网上更深入地寻找,我发现: www.petrikainulainen.net/programming/solr/spring-data-solr-tutorial-adding-custom-methods-to-all-repositories/ (我不能发布更多的2个链接…因为我是新的) 但这一次,它是为Solr(不是Mongo)设计的。 有趣的是:Spring 向所有没有xml配置的存储库添加自定义行为,spring,spring-data,spring-boot,spring-data-mongodb,Spring,Spring Data,Spring Boot,Spring Data Mongodb,我试图向spring应用程序中的所有存储库添加自定义行为,但我不想使用XML配置,只想使用spring注释,如@xxxx 所以我在互联网上寻找,我发现了。 文档的问题在于它处理的是JPA(不是MongoDB),步骤4对于没有xml注释的spring应用程序来说不够具体 文件编制第4步: 直接声明自定义工厂的bean 我们如何做到这一点 所以我没有放弃,我在互联网上更深入地寻找,我发现: www.petrikainulainen.net/programming/solr/spring-data-s
import org.springframework.context.annotation.Configuration;
import org.springframework.data.solr.repository.config.EnableSolrRepositories;
@Configuration
@EnableSolrRepositories(
basePackages = "net.petrikainulainen.spring.datasolr.todo.repository.solr",
repositoryFactoryBeanClass = CustomSolrRepositoryFactoryBean.class
)
public class SolrContext {
//Configuration is omitted.
}
但是我的应用程序仍然不起作用!!!
您可以在github中找到所有代码
github.com/youtix/add_custom_behavior_to_all_repositories_不带xml注释
(我不能发布更多的2个链接…因为我是新的)
现在,我将向您展示我的堆栈跟踪错误、代码和应用程序的体系结构
建筑学
我的代码
应用程序:
package fr.exemple.test;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import fr.exemple.test.model.repository.global.MyRepositoryFactoryBean;
@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableMongoRepositories(
basePackages = {"fr.exemple.test.repository.global"},
repositoryFactoryBeanClass = MyRepositoryFactoryBean.class
)
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setShowBanner(false);
app.run(args);
}
}
测试控制器:
package fr.exemple.test.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import fr.exemple.test.model.repository.TestRepository;
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private TestRepository repository;
@RequestMapping(method=RequestMethod.GET)
public void sharedCustomMethodTest() {
repository.sharedCustomMethod("Hello World !");
}
}
测试:
package fr.exemple.test.model.domain;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document
public class Test {
@Id
private String id;
private String firstName;
private String lastName;
public Test() {}
public Test(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%s, firstName='%s', lastName='%s']",
id, firstName, lastName);
}
}
测试存储库:
package fr.exemple.test.model.repository;
import fr.exemple.test.model.domain.Test;
import fr.exemple.test.model.repository.global.MyRepository;
public interface TestRepository extends MyRepository<Test, String> {
}
package fr.exemple.test.model.repository.global;
import java.io.Serializable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.NoRepositoryBean;
@NoRepositoryBean
public interface MyRepository<T, ID extends Serializable> extends MongoRepository<T, ID>{
void sharedCustomMethod(ID id);
}
包fr.example.test.model.repository;
导入fr.example.test.model.domain.test;
导入fr.example.test.model.repository.global.MyRepository;
公共接口TestRepository扩展了MyRepository{
}
MyRepository:
package fr.exemple.test.model.repository;
import fr.exemple.test.model.domain.Test;
import fr.exemple.test.model.repository.global.MyRepository;
public interface TestRepository extends MyRepository<Test, String> {
}
package fr.exemple.test.model.repository.global;
import java.io.Serializable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.NoRepositoryBean;
@NoRepositoryBean
public interface MyRepository<T, ID extends Serializable> extends MongoRepository<T, ID>{
void sharedCustomMethod(ID id);
}
包fr.example.test.model.repository.global;
导入java.io.Serializable;
导入org.springframework.data.mongodb.repository.MongoRepository;
导入org.springframework.data.repository.NoRepositoryBean;
@菜豆
公共接口MyRepository扩展了MongoRepository{
作废sharedCustomMethod(ID);
}
MyRepositoryFactoryBean:
package fr.exemple.test.model.repository.global;
import java.io.Serializable;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
import org.springframework.data.mongodb.repository.support.MappingMongoEntityInformation;
import org.springframework.data.mongodb.repository.support.MongoRepositoryFactory;
import org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean;
import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.core.support.RepositoryFactorySupport;
import org.springframework.data.util.ClassTypeInformation;
import org.springframework.data.util.TypeInformation;
public class MyRepositoryFactoryBean<R extends MongoRepository<T, I>, T, I extends Serializable>
extends MongoRepositoryFactoryBean<R, T, I> {
@Override
protected RepositoryFactorySupport getFactoryInstance(MongoOperations operations) {
return new MyRepositoryFactory<T, I>(operations);
}
private static class MyRepositoryFactory<T, I extends Serializable> extends
MongoRepositoryFactory {
private MongoOperations mongoOperations;
public MyRepositoryFactory(MongoOperations mongoOperations) {
super(mongoOperations);
this.mongoOperations = mongoOperations;
}
protected Object getTargetRepository(RepositoryMetadata metadata) {
TypeInformation<T> information = ClassTypeInformation.from((Class<T>)metadata.getDomainType());
MongoPersistentEntity<T> pe = new BasicMongoPersistentEntity<T>(information);
MongoEntityInformation<T,I> mongometa = new MappingMongoEntityInformation<T, I>(pe);
return new MyRepositoryImpl<T, I>(mongometa, mongoOperations);
}
protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
return MyRepository.class;
}
}
}
包fr.example.test.model.repository.global;
导入java.io.Serializable;
导入org.springframework.data.mongodb.core.mongoperations;
导入org.springframework.data.mongodb.core.mapping.basicMongOperateEntity;
导入org.springframework.data.mongodb.core.mapping.mongopersistenty;
导入org.springframework.data.mongodb.repository.MongoRepository;
导入org.springframework.data.mongodb.repository.query.MongoEntityInformation;
导入org.springframework.data.mongodb.repository.support.MappingMongoEntityInformation;
导入org.springframework.data.mongodb.repository.support.MongoRepositoryFactory;
导入org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean;
导入org.springframework.data.repository.core.RepositoryMetadata;
导入org.springframework.data.repository.core.support.RepositoryFactorySupport;
导入org.springframework.data.util.ClassTypeInformation;
导入org.springframework.data.util.TypeInformation;
公共类MyRepositoryFactoryBean
扩展MongoRepositoryFactoryBean{
@凌驾
受保护的RepositoryFactorySupport getFactoryInstance(MongoOperations操作){
返回新的MyRepositoryFactory(操作);
}
私有静态类MyRepositoryFactory扩展
蒙哥雷工厂{
私有MongoOperations MongoOperations;
公共MyRepositoryFactory(MongoOperations MongoOperations){
超级(mongoOperations);
this.mongoOperations=mongoOperations;
}
受保护对象GetTargetPository(RepositoryMetadata元数据){
TypeInformation=ClassTypeInformation.from((Class)metadata.getDomainType());
MongOperateSistentEntity pe=新的基本MongOperateSistentEntity(信息);
MongoEntityInformation mongometa=新映射MongoEntityInformation(pe);
返回新的MyRepositoryImpl(mongometa、mongoOperations);
}
受保护类getRepositoryBaseClass(RepositoryMetadata元数据){
返回MyRepository.class;
}
}
}
MyRepositoryImpl:
package fr.exemple.test.model.repository.global;
import java.io.Serializable;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
public class MyRepositoryImpl<T, ID extends Serializable> extends
SimpleMongoRepository<T, ID> implements MyRepository<T, ID> {
private Log log = LogFactory.getLog(MyRepositoryImpl.class);
private MongoOperations mongoOperations;
public MyRepositoryImpl(MongoEntityInformation<T, ID> metadata,
MongoOperations mongoOperations) {
super(metadata, mongoOperations);
this.mongoOperations = mongoOperations;
}
@Override
public void sharedCustomMethod(ID id) {
log.info(id);
}
}
包fr.example.test.model.repository.global;
导入java.io.Serializable;
导入org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
导入org.springframework.data.mongodb.core.mongoperations;
导入org.springframework.data.mongodb.repository.query.MongoEntityInformation;
导入org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
公共类MyRepositoryImpl扩展
SimpleMongoRepository实现了MyRepository{
私有日志Log=LogFactory.getLog(MyRepositoryImpl.class);
私有MongoOperations MongoOperations;
公共MyRepositoryImpl(MongoEntityInformation元数据,
MongoOperations(MongoOperations){
超级(元数据、mongoOperations);
this.mongoOperations=mongoOperations;
}
@凌驾
公共无效sharedCustomMethod(ID){
日志信息(id);
}
}
堆栈跟踪
启动ApplicationContext时出错。显示启用调试日志的自动配置报告(从--debug开始)
2014-07-13 11:12:51.951错误2144---[main]o.s.boot.SpringApplication:应用程序启动失败
org.springframework.beans.factory.BeanCreationException:创建名为“testController”的bean时出错:自动连线依赖项的注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动关联字段:private fr.example.test.model.repository.TestRepository fr.example.test.controller.TestController.repository;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“testRepository”的bean时出错:调用init方法失败;嵌套异常为org.springframework.data.mapping.PropertyReferenceException:找不到类型void的共享属性!
位于org.springframework.beans.factory.annotation.AutoWiredNotationBeanPostProcessor.postProcessPropertyValues(AutoWiredNotationBeanPostProcessor.java:292)
在