[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.나는 내 질문에 대한 대답으로 돌아갈 것이라고 약속 했으므로. 작동 시키려면 응용 프로그램 컨텍스트 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.mongo 템플릿의 메서드 대신 save (Object objectToSave, String collectionName)를 사용할 수 있습니다.
mongo 템플릿의 메서드 대신 save (Object objectToSave, String collectionName)를 사용할 수 있습니다.
from https://stackoverflow.com/questions/18129291/mongodb-and-spel-expressions-in-document-annotations by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring @ 여러 데이터 소스 간의 트랜잭션과 트랜잭션 (0) | 2019.07.12 |
---|---|
[SPRING] 메타 데이터 용 내장 데이터베이스와 다른 데이터 용 두 번째 데이터베이스를 사용하는 Java Spring Batch (0) | 2019.07.12 |
[SPRING] Spring Security maxSession이 작동하지 않습니다. (0) | 2019.07.11 |
[SPRING] Spring RestTemplate 및 프록시 인증 (0) | 2019.07.11 |
[SPRING] Spring 애플리케이션에서 junit 테스트를 실행하는 동안 h2 웹 콘솔에 액세스 (0) | 2019.07.11 |