Я использую Spring-Data для MongoDB:
Информация о версии - org.mongodb.mongo-java-driver версии 2.10.1, org.springframework.data.spring-data-mongodb версии 1.2.1.RELEASE.
У меня есть случай, похожий на тот, который определен в здесь, который (извините за форматирование ...):
Я только начал разрабатывать какое-то приложение на Java с помощью spring-data-mongodb и столкнулся с проблемой, которую не смог решить:
У меня есть пара таких компонентов документа:
@Document(collection="myBeanBar")
public class BarImpl implements Bar {
String id;
Foo foo;
// More fields and methods ...
}
@Document
public class FooImpl implements Foo {
String id;
String someField;
// some more fields and methods ...
}
И у меня есть класс репозитория с методом, который просто вызывает поиск, подобный этому:
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 работает нормально, оно сохранит его в mongo вместе с атрибутом «_class» как для Foo, так и для Bar. Однако поиск по некоторому атрибуту в 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)
Было предложено решение использовать аннотацию @TypeAlias для абстрактного класса, которая сообщала фреймворку использовать конкретную реализацию (в данном случае FooImpl).
В моем случае у меня есть элементы interface вместо элементов abstract:
@Document(collection="myBeanBar")
public class BarImpl implements Bar {
String id;
IFoo foo;
// More fields and methods ...
}
Я очень неохотно помещаю аннотацию к интерфейсу IFoo, которая даст реализацию по умолчанию, вместо этого я хотел бы сообщить фреймворку, какова реализация этого поля по умолчанию в контекст реализуемого класса BarImpl, аналогичный @JsonTypeInfo:
@Document(collection="myBeanBar")
public class BarImpl implements Bar {
String id;
@JsonTypeInfo(use = Id.CLASS, defaultImpl = FooImpl.class)
IFoo foo;
// More fields and methods ...
}
Я нашел этот ответ, который более или менее говорит о том, что следует избегать используя интерфейсы. но я был бы рад узнать, нет ли лучшего варианта.
Любые идеи?
Спасибо!
org.springframework.data
в отладку? Вы сможете увидеть сгенерированный запрос и сравнить этот запрос с вашей схемой в вашем mongo. - person Patouche   schedule 29.05.2014