복붙노트

[SPRING] SD MongoDB 다형성 하위 문서

SPRING

SD MongoDB 다형성 하위 문서

방금 spring-data-mongodb로 Java에서 일부 응용 프로그램을 개발하기 시작했고 해결할 수 없었던 몇 가지 문제를 발견했습니다.

다음과 같은 문서 빈을 두 개 만듭니다.

@Document(collection="myBeanBar")
public class BarImpl implements Bar {
   String id;
   Foo foo;
   // More fields and methods ...
}

@Docuemnt
public class FooImpl implements Foo {
   String id;
   String someField;
   // some more fields and methods ...
}

그리고 나는 이와 비슷한 find를 호출하는 메소드를 가진 저장소 클래스를 가지고있다.

public List<? extends Bar> findByFooField(final String fieldValue) {
    Query query = Query.query(Criteria.where("foo.someField").is(fieldValue));
    return getMongoOperations().find(query, BarImpl.class);
}

bar를 저장하면 Foo와 Bar 모두에 대해 "_class"속성과 함께 mongo에 저장됩니다. 그러나 Foo에서 일부 속성을 발견하면 다음과 같은 예외가 발생합니다.

Exception in thread "main" java.lang.IllegalArgumentException: No property someField found on test.Foo!
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:225)
    at org.springframework.data.mongodb.core.convert.QueryMapper.getPath(QueryMapper.java:202)
    at org.springframework.data.mongodb.core.convert.QueryMapper.getTargetProperty(QueryMapper.java:190)
    at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:86)
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1336)
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1322)
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:495)
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:486)

쿼리의 아무데도 하위 문서 구체화 유형이 지정되어 있기 때문에 일부 파고가 어느 정도 이해가됩니다. Bar의 Entity Information은 foo의 유형이 Foo (FooImpl이 아님)라고 말하면서 차례대로 속성을 가질 수 없다고 말합니다. 그것은 인터페이스이기 때문입니다.

내 질문입니다 : 특정 형식으로 하위 문서 형식을 선언하지 않고이 문제를 해결하거나 해결할 방법이 있습니까?

나는 며칠 동안 그것을 검색하고 문서 및 API와 소스 코드를 살펴 봤지만 명확한 방법으로 찾을 수 없다. 나는 정말로 당신의 도움에 감사드립니다.

고맙습니다.

해결법

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

    1.비슷한 문제가 있었는데 인터페이스를 구현하는 클래스가 있으며 findAll을 사용할 때 오류가 발생합니다.

    비슷한 문제가 있었는데 인터페이스를 구현하는 클래스가 있으며 findAll을 사용할 때 오류가 발생합니다.

    SpringData 코드를 디버깅 한 후, Mapper가 @TypeAlias를 사용하여 인스턴스화해야하는 유형을 발견 했으므로 test.MetaClasse 구현에 @TypeAlias ​​( "FullClassName")를 넣었습니다.

    나는 당신의 상황을 시험해 보았습니다.

  2. from https://stackoverflow.com/questions/14886999/sd-mongodb-polymorphism-in-subdocument by cc-by-sa and MIT license