0

我正在使用 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>

当搜索仅由一个特定字段使用时,为什么会发生异常?

4

0 回答 0