具有自定义集合名称的Spring Data MongoDB存储库

时间:2015-04-13 03:36:52

标签: java spring mongodb repository

我正在使用Spring Data for MongoDB,我需要能够在运行时配置集合。

我的存储库定义为:

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

我尝试了这个愚蠢的例子:

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

但是mongo.event.collection没有像使用@Value注释那样解析为名称。

多一点调试和搜索,我尝试了以下内容:     @Document(collection =“#{$ {mongo.event.collection}}”)

这产生了一个例外:

Caused by: org.springframework.expression.spel.SpelParseException: EL1041E:(pos 1): After parsing a valid expression, there is still more data in the expression: 'lcurly({)'
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.doParseExpression(InternalSpelExpressionParser.java:129)
    at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:60)
    at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:32)
    at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpressions(TemplateAwareExpressionParser.java:154)
    at org.springframework.expression.common.TemplateAwareExpressionParser.parseTemplate(TemplateAwareExpressionParser.java:85)

也许我只是不知道如何使用SPel来访问Spring的Property Configurer中的值。

当单步执行代码时,我发现有一种方法可以指定集合名称甚至表达式,但是,我不确定应该将哪个注释用于此目的或如何使用。

感谢。 -AP _

4 个答案:

答案 0 :(得分:3)

所以,最后,这是一个解决问题的方法。我想我真的不知道如何使用SPeL表达式从Spring Properties Configurer访问数据。

在我的@Configuration类中:

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

@Bean
public String mongoEventCollectionName() {
    return
        mongoEventCollectionName;
}

在我的文件上:

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

这似乎可以正常工作并正确选取我的.properties文件中配置的名称,但是,我仍然不确定为什么我不能像在@Value注释中一样使用$来访问该值。

答案 1 :(得分:1)

像定义您的实体类

@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);
}

为具有“ collectionName”实现的自定义存储库提供实现类

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;
    }
}

在您的存储库界面的扩展列表中添加EventDataRepositoryImpl,就像这样

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

现在在使用MongoRepository设置集合名称的服务类中,它看起来像

@Autowired
EventDataRepository  repository ;

repository.setCollectionName("collectionName");

答案 2 :(得分:0)

实体类

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;

    }
}

配置类

import tensorflow as tf
import numpy as np
feature_columns = [tf.feature_column.numeric_column("x", shape=[1])]
estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns)

答案 3 :(得分:0)

您可以仅使用SPeL来解决此问题:

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

更新Spring 5.x:

从Spring 5.x左右开始,您需要在环境之前添加一个@:

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