2014-05-13 1 views
0

MongoTemplate은 Mongo에 삽입하는 모든 것에 "_class"라는 속성을 삽입하고이를 해제하는 방법이 있습니다.Spring 데이터에서 _class 속성이없는 Mongo 문서를 읽는 방법

그러나 _class 특성이없는 파일은 읽지 않으려 고합니다. 단순히 mongo 문서에서 제거하면 액세스 할 수 없게됩니다. 자신이 쓰지 않은 데이터를 읽는 것이 명백한 유스 케이스이므로 여기에서 뭔가를 놓치고 있어야한다는 것을 알았습니다.

나는 이것을 사용하려고했습니다 : SomeClass가 @Id 및 @Document 및 someCollection의 문서에 주석이
List<SomeClass> list = mongoTemplate.findAll(SomeClass.class, "someCollection"); 

는 ... 그렇지 않으면 제대로 개체에 매핑합니다. 코드에서 이러한 객체 중 하나를 생성하고, insert를 사용하여 Mongo로 가져 와서 다시 읽는 것을 볼 수 있습니다.

_class가 있으면 제대로 작동하지만 그렇지 않은 경우 실패합니다. 나는 다형성이나 실제로이 속성이 필요할만한 것에 대해서는 신경 쓰지 않습니다. MongoTemplate이 자체 작성하지 않은 데이터를 읽도록하려면 어떻게해야합니까?

답변

2

좋아요, 대답을 찾았습니다 ... DavidA의 조언은 정확했지만 중요한 부분을 놓치 셨습니다 : 널 유형 매핑 비즈니스에 MappingMongoConverter dealio를 설정하면 "_class"오염 작성이 중지되지 않을뿐만 아니라 읽는 것을 멈 춥니 다. 이로 인해 Mongo에서 문서를 검색 할 때 제공 한 유형으로 되돌아갑니다.

아무도 실제로 언급하지 않은 곳입니다. :)

따라서, 이러한 문제가 다른 사람을 위해, 여기 내가 사용하는 XML 구성이다 (I에 유래 여기에 다른 곳에서 발견 뭔가에서 적응,하지만 난 죄송 링크 손실) :

<mongo:db-factory id="mongoDbFactory" host="${mongo.host}" port="${mongo.port}" dbname="${mongo.dbname}"/> 

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> 
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> 
    <constructor-arg name="mongoConverter" ref="mongoConverter" /> 
    <property name="writeResultChecking" value="EXCEPTION" /> 
</bean> 

<bean id="mongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper"> 
    <constructor-arg name="typeKey"><null/></constructor-arg> 
</bean> 

<bean id="mongoMappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" /> 

<bean id="mongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter"> 
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> 
    <constructor-arg name="mappingContext" ref="mongoMappingContext" /> 
    <property name="typeMapper" ref="mongoTypeMapper"></property> 
</bean> 

을 그리고 자바 코드에서 : 내가 원하는 UnifiedProduct 클래스 결과

//build query object 
UnifiedProduct mpp = mongoTemplate.findOne(query, UnifiedProduct.class, "collection-name"); 

..., 그리고 성가신 "_class"오염.

+0

니스. 알아 둘만한. 명시 적 변환기 시도에 대한 의견을 게시하려했으나보다 일반적인 해결책입니다. 돌아와서 정답을 게시 해 주셔서 감사합니다. – DavidA

0

스프링의 MappingMongoConverterMongoTypeMapper을 사용하여 데이터베이스에서 DBObject를 읽을 때 사용할 유형을 결정합니다. DefaultMongoTypeMapper은 설명 된대로 작동하기 위해 "_class" 속성을 사용합니다.

자신 만의 MongoTypeMapper을 구현하고 MappingMongoConberter에게 사용하도록 알릴 수 있어야합니다. 귀하의 버전은 "_class" 값 대신 다른 표시기를 사용하여 읽을 때 어떤 유형을 만들어야하는지 결정할 수 있습니다.

+0

DavidA : 응답 해 주셔서 감사합니다. 대답은 불가능하다는 것입니다. 나는 약간 혼란 스럽다 - 내가 위의 스 니펫에서 "SomeClass.class"를 사용하기를 원하는 클래스를 명시 적으로 말하면서 스프링 데이터 - 몽고 스터프가 왜 그렇게 될지 모르겠다. 다른 NoSQL 및/또는 JSON 매핑 구현에 이러한 제한이없는 경우 특히 이러한 방식으로 설계해야합니다. MongoTypeMapper를 만들면 항상 관심있는 단일 유형을 사용하고 작동하는지 확인해 볼 것입니다. – user3633955

관련 문제