Я использую Spring -Data for MongoDB:
Информация о версии - org.mongodb.mongo-java-driver версия 2.10.1, org.springframework.data.spring-data-mongodb версия 1.2.1.RELEASE.
У меня есть случай, похожий на тот, который определен в здесь, который (извините за форматирование...):
Я только начал разрабатывать некоторые приложения на Java с помощью Spring -data-mongodb и столкнулся с проблемой, которую я не смог решить:
У меня есть пара документов beans следующим образом:
@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);
}
Сохранение панели работает очень хорошо, это спасло бы ее в монго вместе с Атрибут "_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).
В моем случае у меня есть интерфейс, а не 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 ...
}
Я нашел этот ответ, который более или менее говорит, чтобы избежать использования интерфейсов. но я был бы рад узнать, нет ли лучшего варианта.
Любые идеи?
Спасибо!