ObjectIdSerializer sempre grava a propriedade mapeada com @ObjectId em uma nova instância de ObjectId. Isso está errado quando você mapeia essa propriedade para uma String.
Para evitar esse comportamento, escrevi um NoObjectIdSerializer :
public class NoObjectIdSerializer extends JsonSerializer<String> {
@Override
public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeString(value);
}
}
usado assim:
@ObjectId
@JsonSerialize(using = NoObjectIdSerializer.class)
protected final String _id;
Há uma questão em aberto.