문제

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에서 지속 가능하고 읽을 수 있는 객체를 생성하는 일을 담당합니다.이는 변환기 인스턴스가 유형 정보 자체를 작성해야 함을 의미합니다.

제대로 작동하지 않고 작은 샘플 프로젝트를 컴파일하여 문제를 재현할 수 있는 경우(실행할 테스트 사례 권장) 언제든지 티켓을 제출해 주세요. 지라 사례.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top