Spring Data MongoDB는 _class 정보를 무시합니다.
-
20-12-2019 - |
문제
spring-data-mongodb 1.3.3.RELEASE 및 Java 1.6을 사용하는 데 문제가 있습니다.
레거시 데이터를 처리해야 하기 때문에 설정이 약간 복잡하므로 사용자 정의가 있습니다. TypeMapper
(확장 DefaultMongoTypeMapper
) 및 두 가지 다른 읽기/쓰기 변환기 조합.추가적으로 나는 @TypeAlias
설정을 위해 _class
데이터베이스의 정보.
문제가 있는 모델은 여러 개의 중첩 목록으로 구성되어 있으며 일부는 다음과 같이 입력됩니다.
List<DocumentValue>
MyObject에는 개체 목록이 포함될 수 있습니다.
List<Object>
다른 내용을 포함할 수 있는 DocumentValue
물체.
이 설정은 작동하는 것 같습니다. 단위 테스트는 아무 문제 없이 실행되며, 개체 매핑은 디버거에서 꽤 괜찮아 보입니다.내 애플리케이션은 웹 애플리케이션이고 작성할 수 있습니다. DocumentValue
컬렉션에 포함되면 _class
정보가 존재합니다.
서버(내 경우에는 Tomcat)를 종료하지 않는 한 객체 매핑은 작동합니다.하지만 서버를 다시 시작하면(새 JVM 시작) DocumentValue
개체가 올바르게 매핑되지 않았지만 다음과 같이 처리됩니다. java.util.Map
.그만큼 _class
정보가 무시되는 것 같습니다.내 매핑 컨텍스트에 문제가 있을 수 있다고 생각하지만(Spring 컨텍스트가 시작되는 동안 내 모델 엔터티를 등록해야 합니까?) 잘못된 구성을 찾을 수 없습니다.비슷한 문제가 있거나 제안 사항이 있는 사람이 있나요?
해결책
답장을 보내 주셔서 감사합니다._class가 무시되는 이유를 찾은 것 같습니다.당신 말이 맞습니다. 저는 TypeMapper의 특이한 조합을 사용합니다.
내 CustomTypeMapper를 보여드리겠습니다.
public class CustomTypeMapper extends DefaultMongoTypeMapper {
public CustomTypeMapper (MongoMappingContext mappingContext) {
super(DEFAULT_TYPE_KEY,
Arrays.asList(new MappingContextTypeInformationMapper(
mappingContext)));
}
@Override
public <T> TypeInformation<? extends T> readType(DBObject source,
TypeInformation<T> basicType) {
// do some custom recognition
// or just to the common type mapping
return super.readType(source, basicType);
}
}
일반적인 유형 인식 외에 특별한 점은 @TypeAlias 주석을 사용하기 위해 MappingContextTypeInformationMapper가 사용되는 생성자입니다.
여기서 핵심은 필요한 MongoMappongContext입니다.기능적이지 않은 경우에는 다음과 같이 CustomTypeMapper를 초기화했습니다.
<bean id="customTypeMapper" class="de.flexguse.repository.CustomTypeMapper">
<constructor-arg name="mappingContext">
<bean class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
</constructor-arg>
</bean>
작동했지만 MongoMappingContext의 새 인스턴스에 base-package 속성을 설정하여 제공된 TypeInformation이 포함되어 있지 않았기 때문에 잘못되었습니다.
<mongo:mapping-converter id="customMappingConverter" db-factory-ref="mongoDbFactory"
type-mapper-ref="customTypeMapper" base-package="de.flexguse.model" >
<mongo:custom-converters>
... some custom converters ...
</mongo:custom-converters>
</mongo:mapping-converter>
불행히도 MongoMappingContext를 생성자 인수로 사용할 수 있도록 생성된 위치를 파악할 수 없었기 때문에 @Autowire를 사용하여 MongoMappingContext를 가져오는 간단한 Bean MongoMappingContextProvider를 발명했습니다.
public class MongoMappingContextProvider {
@Autowired
private MongoMappingContext mappingContext;
/**
* @return the mappingContext
*/
public MongoMappingContext getMappingContext() {
return mappingContext;
}
}
CustomTypeMapper의 Spring 구성은 이제 다음과 같습니다.
<bean id="mongoMappingContextProvider" class="de.flexguse.repository.MongoMappingContextProvider" />
<bean id="customTypeMapper" class="de.flexguse.repository.CustomTypeMapper">
<constructor-arg name="mappingContext" value="#{mongoMappingContextProvider.mappingContext}" />
</bean>
이 솔루션은 저에게 효과적입니다.
그건 그렇고, 내가 사용하는 모든 모델 빈에 대한 모든 TypeInformations를 확실히 갖기 위해 지속되는 모든 모델 빈에 @Document를 추가했습니다. 만약을 대비해;)
어쩌면 이것은 비슷한 문제가 있는 다른 사람에게 도움이 될 수도 있습니다.
안부, 크리스토프
다른 팁
비정상적인 조합으로 인해 문제가 발생하는 것으로 의심됩니다. TypeMapper
사용법 및 변환기. 만약에 수동으로 구현 Converter
특정 유형에 대한 인스턴스가 등록되었습니다. Converter
MongoDB에서 지속 가능하고 읽을 수 있는 객체를 생성하는 일을 담당합니다.이는 변환기 인스턴스가 유형 정보 자체를 작성해야 함을 의미합니다.
제대로 작동하지 않고 작은 샘플 프로젝트를 컴파일하여 문제를 재현할 수 있는 경우(실행할 테스트 사례 권장) 언제든지 티켓을 제출해 주세요. 지라 사례.