2017-01-17 15 views
3

Spring Data MongoDBとSpring Batchを使用して、エンティティクラスが保存され、インデックスが作成されるコレクション名をカスタマイズしようとしています。次のようにクラスが宣言されています。Spring用のSpELでBeanを解決できません。データMongoDBコレクション名

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

とアイテムライター:

public class VariantSourceMongoWriter extends MongoItemWriter<VariantSource> { 

    public VariantSourceEntityMongoWriter(MongoOperations mongoOperations, String collectionName) { 
     setTemplate(mongoOperations); 
     setCollection(collectionName); 
    } 
} 

の保存が正常に動作します:オブジェクトを引数として提供コレクションに書かれています。問題は、インデックスがクラス名(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; 

} 

私はインスタンスをチェックし、正しくユニットテストにautowiredされ、私はそれがSpeIで動作させることはできません。

このように見えるように@Document注釈を変更した後:

@Document(collection = "#{@mongoCollections.getCollectionFilesName()}") 

次の例外がスローされます。

org.springframework.expression.spel.SpelEvaluationException:EL1057E:(POS 1): Bean 'mongoCollections'へのアクセスを解決するコンテキストにBeanリゾルバが登録されていません

そして、これを使用する場合:

@Document(collection = "#{mongoCollections.getCollectionFilesName()}") 

例外は、このいずれかになります。

org.springframework.expression.spel.SpelEvaluationException:EL1007E:(POS 0):プロパティまたはフィールド 'mongoCollectionsは' ヌル

で見つけることができません指定された最後に、次のように名前のコレクションを作成します

、シンボルが含ま:

@Document(collection = "@mongoCollections.getCollectionFilesName()") 

答えて

0

注射を固定するために、this answerによって指し示されるように:

@Document(collection = "#{mongoCollections.getCollectionFilesName()}") 

SpelEvaluationException:EL1007E:(POS 0):プロパティまたはフィールド 'mongoCollections' がヌル

(またはAで見つけることができません直接メソッドBean:@Document(collection = "#{getCollectionFilesName}"))、ApplicationContextをMongoMappingContext(MongoConverterをインスタンス化するために使用され、後でMongoTemplateを生成するために使用される)に設定してみてください:

@Bean 
public MongoMappingContext MongoMappingContext() { 
    MongoMappingContext mappingContext = new MongoMappingContext(); 
    mappingContext.setApplicationContext(applicationContext); 
    return mappingContext; 
} 
関連する問題