Spring Data MongoDB Repository with custom collection name

后端 未结 4 1035
别那么骄傲
别那么骄傲 2021-01-06 01:18

I am using Spring Data for MongoDB and I need to be able to configure collection at runtime.

My repository is defined as:

@Repository
public interfac         


        
相关标签:
4条回答
  • 2021-01-06 01:26

    Entity Class

    @Document    // remove the parameters from here
    
    
    public class EscalationCase 
    {
    
    }
    

    Configuration class

    public class MongoDBConfiguration {
    
        private final Logger logger = LoggerFactory.getLogger(MongoDBConfiguration.class);
    
        @Value("${sfdc.mongodb.collection}") //taking collection name from properties file 
        private String collectionName;
    
        @Bean
    
        public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MongoMappingContext context) {
    
            MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), context);
            converter.setTypeMapper(new DefaultMongoTypeMapper(null));
            MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);
            if (!mongoTemplate.collectionExists(collectionName)) {
                mongoTemplate.createCollection(collectionName);  // adding the collection name here
            }
            return mongoTemplate;
    
        }
    }
    
    0 讨论(0)
  • 2021-01-06 01:31

    define your entity class like

    @Document(collection = "${EventDataRepository.getCollectionName()}")
    public class EventData implements Serializable {
    

    Define a custom repository interface with getter and setter methods for "collectionName"

    public interface EventDataRepositoryCustom {
    
        String getCollectionName();
    
        void setCollectionName(String collectionName);
    }
    

    provide implementation class for custom repository with "collectionName" implementation

    public class EventDataRepositoryImpl implements EventDataRepositoryCustom{
    
        private static String collectionName = "myCollection";
    
        @Override
        public String getCollectionName() {
            return collectionName;
        }
    
        @Override
        public void setCollectionName(String collectionName) {
            this.collectionName = collectionName;
        }
    }
    

    Add EventDataRepositoryImpl to the extends list of your repository interface in this it would look like

    @Repository
    public interface EventDataRepository extends MongoRepository<EventData, String>, EventDataRepositoryImpl  {
    }
    

    Now in your Service class where you are using the MongoRepository set the collection name, it would look like

    @Autowired
    EventDataRepository  repository ;
    
    repository.setCollectionName("collectionName");
    
    0 讨论(0)
  • 2021-01-06 01:33

    So, at the end, here is a work around that did the trick. I guess I really don't know how to access data from Spring Properties Configurer using the SPeL expressions.

    In my @Configuration class:

    @Value("${mongo.event.collection}")
    private String
        mongoEventCollectionName;
    
    @Bean
    public String mongoEventCollectionName() {
        return
            mongoEventCollectionName;
    }
    

    On my Document:

    @Document(collection = "#{mongoEventCollectionName}")
    

    This, appears to work and properly pick up the name configured in my .properties file, however, I am still not sure why I could not just access the value with $ as I do in the @Value annotation.

    0 讨论(0)
  • 2021-01-06 01:34

    You can solve this problem by just using SPeL:

    @Document(collection = "#{environment.getProperty('mongo.event.collection')}")
    public class EventData implements Serializable {
        ...
    }
    

    Update Spring 5.x:

    Since Spring 5.x or so you need an additional @ before environment:

    @Document(collection = "#{@environment.getProperty('mongo.event.collection')}")
    public class EventData implements Serializable {
        ...
    }
    
    0 讨论(0)
提交回复
热议问题