Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 向所有没有xml配置的存储库添加自定义行为_Spring_Spring Data_Spring Boot_Spring Data Mongodb - Fatal编程技术网

Spring 向所有没有xml配置的存储库添加自定义行为

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

我试图向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)设计的。 有趣的是:

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) 在