在Spring中将ObjectIdMap到DTO中的String的正确方法

zlwx9yxi  于 2022-11-21  发布在  Spring
关注(0)|答案(1)|浏览(116)

我正在使用Spring WebSocket。我有Message的DTO

@AllArgsConstructor
@Data
public class MessageDto {

    private ObjectId messageId;
    private ObjectId chatId;
}

当我将此DTO作为响应发送时,DTO中的ObjectId字段Map如下:

如何像62790c02513ad11442eec6d7一样将ObjectId字段Map到String

cqoc49vn

cqoc49vn1#

Spring使用Jackson将对象Map到JSON,因此Map对象中的ObjectId字段的正确方法是配置Jackson序列化程序。
创建序列化程序类:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.bson.types.ObjectId;

import java.io.IOException;

public class ObjectIdSerializer extends JsonSerializer<ObjectId> {

    @Override
    public void serialize(ObjectId id, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
            throws IOException {
        jsonGenerator.writeObject(id == null ? null : id.toString());
    }
}

然后在DTO类中指定序列化程序:

@AllArgsConstructor
@Data
public class MessageDto {

    @JsonSerialize(using = ObjectIdSerializer.class)
    private ObjectId messageId;
    @JsonSerialize(using = ObjectIdSerializer.class)
    private ObjectId chatId;
}

总之,MessageDto对象的ObjectId字段将像JSON中的字符串一样被序列化
当然,将JSON反序列化为一个对象是有问题的。有JsonDeserializer<>@JsonDeserialize来解决这个问题。但是在那里(MapObjectId类字段)反序列化器是无用的,因为ObjectId已经有了一个构造函数,它接收一个String参数,所以Jackson会使用它。

相关问题