我正在使用 Spring MVC 5.2.6 创建一个简单的预订系统。我注意到在我的情况下(我不需要太多的可扩展性)使用 @DBRef 和 mongodb 是一个很好的解决方案。但是我面临一个非常奇怪的问题。org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class com.mongodb.DBRef
域模型文件 User.java:
@Document(collection = "users")
public class User {
@Id
private String ID;
@Field
private String name;
@DBRef
private Address address;
@Field
private String phone;
@Field
private String email;
public User() {}
public User(final String name, final Address address, final String phone, final String email) {
this.name = name;
this.phone = phone;
this.address= address;
this.email = email;
}
//setters and getters
}
地址.java:
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Document(collection = "addresses")
public class Address {
@Id
private String id;
@Field
private String street;
@Field
private String zipCode;
@Field
private String building;
@Field
private String city;
public Address() {
}
public Address(final String street, final String zipCode, final String building, final String city) {
this.street = street;
this.zipCode = zipCode;
this.building = building;
this.city = city;
}
public String getCity() {
return city;
}
public void setCity(final String city) {
this.city = city;
}
public String getId() {
return id;
}
public void setId(final String id) {
this.id = id;
}
public String getStreet() {
return street;
}
public void setStreet(final String street) {
this.street = street;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(final String zipCode) {
this.zipCode = zipCode;
}
public String getBuilding() {
return building;
}
public void setBuilding(final String building) {
this.building = building;
}
}
MongoConfiguration 里面有这些家伙:
@Bean
public MappingMongoConverter mappingMongoConverter(final MongoDbFactory mongoDbFactory,
final MongoMappingContext mongoMappingContext) {
final DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
final MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
converter.setTypeMapper(new DefaultMongoTypeMapper(null));
converter.setCodecRegistryProvider(mongoDbFactory);
return converter;
}
@Bean
public MongoTemplate mongoTemplate(final MongoDbFactory dbFactory,
final MappingMongoConverter mappingMongoConverter) throws Exception {
final MongoTemplate template = new MongoTemplate(dbFactory, mappingMongoConverter);
return template;
}
仅当使用 findByEmail 请求电子邮件地址时才会出现此问题。当使用 findByPhone 时,结果将正常返回而没有问题。
来自控制台的 MongoDB 查询显示,电话号码和电子邮件都在地址参考之后。
在我的 pom.xml 我有这个依赖项:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.11.2</version>
</dependency>
当搜索仅由一个特定字段使用时,为什么会发生异常?