如何使用 @BsonRepresentation 将带有 String id 的 POJO 映射到带有 ObjectId id 的 MongoDB 文档

问题描述 投票:0回答:1

我在 MongoDB 数据库中有一个用户集合。每个文档都有一个 ObjectId 类型的 _id。我希望能够将它们映射到 POJO,该 POJO 在我的应用程序中具有 String 类型的 id。

目前,我的应用程序中的 User POJO 有一个像这样的 ObjectId。

@BsonId
private ObjectId id;

MongoDB 文档中的“POJO 定制”页面表示我应该能够执行以下操作:

@BsonId
@BsonRepresentation(BsonType.OBJECT_ID)
private String id;

但是仍然会出现以下错误:

Failed to decode 'User'. Decoding '_id' errored with: readString can only be called when CurrentBSONType is STRING, not when CurrentBSONType is OBJECT_ID.

这是用于从数据库检索用户的代码。

@PostConstruct
public void init() {
    MongoClient mongo = mongoClientProvider.getMongoClient();
    MongoDatabase db = mongo.getDatabase("ct6049DB");
    collection = db.getCollection("users", User.class);
}

// Get a user by their email
public User getUserByEmail(String email) {
    return collection.find(eq("email", email)).first();
}

我的 MongoClient 上使用的 CodecRegistry 是:

CodecRegistry myRegistry = fromRegistries(
    MongoClientSettings.getDefaultCodecRegistry(),             
    fromProviders(PojoCodecProvider.builder().automatic(true).build())
);

但我也尝试添加

Conventions.ANNOTATION_CONVENTION
到此。

我应该指定将 POJO 上的 id 更改为 ObjectId 而不是 String(如此处答案中所指定:readString 仅当 CurrentBSONType 为 STRING 时才能调用,而不是当 CurrentBSONType 为 OBJECT_ID 时调用)不是一个选项。链接问题的其他答案建议删除我的集合中具有 id 的 ObjectId (也不是一个选项)的所有文档,添加 @BsonId (我已经有了),并添加 @BsonProperty("id") (这不解决了这个问题,添加 @BsonProperty("_id")) 也没有解决。

这是一个演示 SQL 和 NoSQL 数据库之间差异的项目,因此 POJO 与数据库无关(id 的字符串),同时在数据库中维护 MongoDB 的首选 id 类型会很好。

java mongodb bson
1个回答
0
投票

我正在提供 Java 的代码结构。

@Data
@Document("users")
public class User {

    @Id
    String id;

    @SearchField
    String firstName;
}

然后,

public interface UserRepository extends MongoRepository<User,String> {

}

这个存储库可以帮助您从 mongo 获取数据。

然后,

这是服务代码

User find();

然后,

是服务实现,实现服务类并用

@Service
注解进行注释。

@Autowired

用户存储库用户存储库;

public User find() {
    return userRepository.findAll();
    }

然后在最后一个控制器部分之后,

@RestController
@RequestMapping("/users")
public class UserController{
  @Autowired
UserService userService;
@RequestMapping(name="getUser",  value="/getUser",  method=RequestMethod.GET)
public Response<User> getUserById(){
    return Response.ok().setData(userService.find()).setMessage("YOUR_RESPONSE_MESSAGE");
  }
}

我的回应课,

@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Response<T> {

    private Status status;
    private T data;
    private String message;
}

整个流程是从控制器(里面的响应)>服务>服务实现>repo>模型(pojo)开始。

希望你理解。

© www.soinside.com 2019 - 2024. All rights reserved.