无法在 SpEL 中为 Spring Data MongoDB 集合名称解析 bean

ark*_*lad 7 spring-batch spring-el spring-data-mongodb spring-boot

我正在尝试使用 Spring Data MongoDB 和 Spring Batch 自定义保存实体类并为其编制索引的集合名称。该类声明如下:

@Document
@CompoundIndex(name = "unique_source", def = "{'fid': 1, 'sid': 1}", unique = true, background = true)
public class VariantSource {
    ...
}
Run Code Online (Sandbox Code Playgroud)

和项目作家:

public class VariantSourceMongoWriter extends MongoItemWriter<VariantSource> {

    public VariantSourceEntityMongoWriter(MongoOperations mongoOperations, String collectionName) {
        setTemplate(mongoOperations);
        setCollection(collectionName);
    }
}
Run Code Online (Sandbox Code Playgroud)

保存工作正常:对象被写入作为参数提供的集合中。问题是索引是在默认集合中创建的,以类名 ( variantSource)命名。

阅读thisthis后,我创建了以下内容:

public class MongoCollections {

    public String getCollectionFilesName() {
        return "my_custom_collection_name"; // TODO Dynamic value
    }
}


@Configuration
public class MongoCollectionsConfiguration {

    @Bean
    public MongoCollections mongoCollections() {
        return new MongoCollections(); 
    }


@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MongoCollectionsConfiguration.class})
public class VariantSourceMongoWriterTest {

    @Autowired
    private MongoCollections mongoCollections;

}
Run Code Online (Sandbox Code Playgroud)

我已经检查过实例是否正确地自动连接到单元测试中,但我无法使其与 SpEL 一起使用。

@Document注释更改为如下所示后:

@Document(collection = "#{@mongoCollections.getCollectionFilesName()}")
Run Code Online (Sandbox Code Playgroud)

抛出以下异常:

org.springframework.expression.spel.SpelEvaluationException: EL1057E:(pos 1): 没有在上下文中注册的 bean 解析器来解析对 bean 'mongoCollections' 的访问

如果我使用这个:

@Document(collection = "#{mongoCollections.getCollectionFilesName()}")
Run Code Online (Sandbox Code Playgroud)

例外是这个:

org.springframework.expression.spel.SpelEvaluationException: EL1007E:(pos 0): 在 null 上找不到属性或字段“mongoCollections”

最后,以下内容创建一个具有指定名称的集合,包括符号:

@Document(collection = "@mongoCollections.getCollectionFilesName()")
Run Code Online (Sandbox Code Playgroud)

jmm*_*mut 5

正如这个答案所指出的,要修复注入:

@Document(collection = "#{mongoCollections.getCollectionFilesName()}") 
Run Code Online (Sandbox Code Playgroud)

SpelEvaluationException:EL1007E:(pos 0):无法在 null 上找到属性或字段“mongoCollections”

(或者直接方法bean:)@Document(collection = "#{getCollectionFilesName}"),尝试将ApplicationContext设置到MongoMappingContext(用于实例化MongoConverter,然后实例化MongoTemplate):

@Bean
public MongoMappingContext MongoMappingContext() {
    MongoMappingContext mappingContext = new MongoMappingContext();
    mappingContext.setApplicationContext(applicationContext);
    return mappingContext;
}
Run Code Online (Sandbox Code Playgroud)