복붙노트

[SPRING] @Document 주석의 MongoDB 및 SpEL 표현식

SPRING

@Document 주석의 MongoDB 및 SpEL 표현식

나는 정의한 몇 가지 규칙에 따라 동일한 문서를 다른 모음으로로드하기 위해 SpEL을 사용하려고합니다.

그래서 내가 가지고있는 것으로 시작하려면 :

- 모든 문서 중 첫 번째 :

@Document(collection = "#{@mySpecialProvider.getTargetCollectionName()}")
public class MongoDocument {
// some random fields go in
}

- 둘째, 컬렉션 이름을 제공해야하는 공급자 bean이있다 :

@Component("mySpecialProvider")
public class MySpecialProvider {

public String getTargetCollectionName() {
// Thread local magic goes in bellow
    String targetCollectionName = (String) RequestLocalContext.getFromLocalContext("targetCollectionName");
    if (targetCollectionName == null) {
        targetCollectionName = "defaultCollection";
    }
    return targetCollectionName;
 }
}

문제는 공급자가 생성해야하는 특정 컬렉션에 문서를 삽입하려고하면 다음과 같은 스택 추적이 발생한다는 것입니다.

org.springframework.expression.spel.SpelEvaluationException : EL1057E : (pos 1) : Bean 'mySpecialProvider'에 대한 액세스를 확인하기 위해 컨텍스트에 등록 된 Bean 확인자가 없습니다.

나는 또한 Spring 구성 요소 ApplicationContextAware를 만들려고했지만 여전히 운이 없다.

해결법

  1. ==============================

    1.나는 내 질문에 대한 대답으로 돌아갈 것이라고 약속 했으므로. 작동 시키려면 응용 프로그램 컨텍스트 XML 파일의 mongoTemplate bean에 대해 다음 설정이 필요합니다.

    나는 내 질문에 대한 대답으로 돌아갈 것이라고 약속 했으므로. 작동 시키려면 응용 프로그램 컨텍스트 XML 파일의 mongoTemplate bean에 대해 다음 설정이 필요합니다.

    <mongo:db-factory dbname="${myDatabaseName.from.properties.file}" mongo-ref="mongo"/>
    <bean id="mongoMappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext"/>   
    <bean id="mappingMongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter" c:mongoDbFactory-ref="mongoDbFactory"
                c:mappingContext-ref="mongoMappingContext"/>
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"
                c:mongoDbFactory-ref="mongoDbFactory" c:mongoConverter-ref="mappingMongoConverter"/>
    

    그리고 위의 설정 및 솔루션 내 질문에 제안 작동합니다. 동일한 도메인 개체를 사용하여 선택한 설정에 따라 여러 컬렉션에 저장할 수 있습니다.

    편집하다:

    누군가가 관련 질문에서이를 요구했기 때문에 ThreadLocal 컨텍스트에 대한 로직도 여기에서 업데이트 할 것입니다.

    다음 구현을 감싸는 RequestLocalContext 클래스를 만듭니다.

    private static final ThreadLocal<Map> CONTEXT = new ThreadLocal<Map>() {
            protected Map initialValue() {
                Map localMap = new HashMap();
                localMap.put(LocalContextKeys.CONVERSATION_CONTEXT, new HashMap());
                return localMap;
            };
        };
    
    public static void putInLocalContext(Object key, Object value) {
        Map localMap = CONTEXT.get();
        localMap.put(key, value);
    }
    
     public static Object getFromLocalContext(Object key) {
        Map localMap = CONTEXT.get();
        return localMap.get(key);
    }
    

    여기서, LocalContextKeys는, ThreadLocal 문맥 Map로 허가되고있는 키를 포함한 enum입니다. 키는 사용자가 정의 했으므로 필요할 때마다 키를 입력하십시오.

  2. ==============================

    2.mongo 템플릿의 메서드 대신 save (Object objectToSave, String collectionName)를 사용할 수 있습니다.

    mongo 템플릿의 메서드 대신 save (Object objectToSave, String collectionName)를 사용할 수 있습니다.

  3. from https://stackoverflow.com/questions/18129291/mongodb-and-spel-expressions-in-document-annotations by cc-by-sa and MIT license