use of io.micronaut.data.document.serde.IdSerializer in project micronaut-data by micronaut-projects.
the class DataEncoderContext method findCustomSerializer.
@Override
public <T, D extends Serializer<? extends T>> D findCustomSerializer(Class<? extends D> serializerClass) throws SerdeException {
if (serializerClass == IdSerializer.class) {
IdSerializer idSerializer = new IdSerializer() {
@Override
public Serializer<Object> createSpecific(EncoderContext encoderContext, Argument<?> type) throws SerdeException {
boolean isGeneratedObjectIdAsString = type.isAssignableFrom(String.class) && type.isAnnotationPresent(GeneratedValue.class);
if (isGeneratedObjectIdAsString) {
Serializer<? super ObjectId> objectIdSerializer = findSerializer(OBJECT_ID);
return (encoder, encoderContext2, stringType, value) -> {
String stringId = (String) value;
objectIdSerializer.serialize(encoder, encoderContext2, OBJECT_ID, new ObjectId(stringId));
};
}
return (Serializer<Object>) findSerializer(type);
}
@Override
public void serialize(Encoder encoder, EncoderContext context, Argument<?> type, Object value) {
throw new IllegalStateException("Create specific call is required!");
}
};
return (D) idSerializer;
}
if (serializerClass == CustomConverterSerializer.class) {
CustomConverterSerializer customConverterSerializer = new CustomConverterSerializer() {
@Override
public Serializer<Object> createSpecific(EncoderContext encoderContext, Argument<?> type) throws SerdeException {
Class<?> converterClass = type.getAnnotationMetadata().classValue(MappedProperty.class, "converter").orElseThrow(IllegalStateException::new);
Class<Object> converterPersistedType = type.getAnnotationMetadata().classValue(MappedProperty.class, "converterPersistedType").orElseThrow(IllegalStateException::new);
Argument<Object> convertedType = Argument.of(converterPersistedType);
Serializer<? super Object> serializer = findSerializer(convertedType);
AttributeConverter<Object, Object> converter = attributeConverterRegistry.getConverter(converterClass);
return new Serializer<Object>() {
@Override
public void serialize(Encoder encoder, EncoderContext context, Argument<?> type, Object value) throws IOException {
if (value == null) {
encoder.encodeNull();
return;
}
Object converted = converter.convertToPersistedValue(value, ConversionContext.of(type));
if (converted == null) {
encoder.encodeNull();
return;
}
serializer.serialize(encoder, context, convertedType, converted);
}
};
}
@Override
public void serialize(Encoder encoder, EncoderContext context, Argument<?> type, Object value) {
throw new IllegalStateException("Create specific call is required!");
}
};
return (D) customConverterSerializer;
}
return parent.findCustomSerializer(serializerClass);
}
use of io.micronaut.data.document.serde.IdSerializer in project micronaut-data by micronaut-projects.
the class DataSerdeRegistry method findCustomSerializer.
@Override
public <T, D extends Serializer<? extends T>> D findCustomSerializer(Class<? extends D> serializerClass) throws SerdeException {
if (serializerClass == OneRelationSerializer.class) {
OneRelationSerializer oneRelationSerializer = new OneRelationSerializer() {
@Override
public Serializer<Object> createSpecific(EncoderContext encoderContext, Argument<?> type) throws SerdeException {
RuntimePersistentEntity entity = runtimeEntityRegistry.getEntity(type.getType());
if (entity.getIdentity() == null) {
throw new SerdeException("Cannot find ID of entity type: " + type);
}
BeanProperty property = entity.getIdentity().getProperty();
Argument<?> idType = entity.getIdentity().getArgument();
Serializer<Object> idSerializer = encoderContext.findCustomSerializer(IdSerializer.class).createSpecific(encoderContext, idType);
return new Serializer<Object>() {
@Override
public void serialize(Encoder encoder, EncoderContext context, Argument<?> type, Object value) throws IOException {
Object id = property.get(value);
if (id == null) {
encoder.encodeNull();
} else {
Encoder en = encoder.encodeObject(type);
en.encodeKey(MongoUtils.ID);
idSerializer.serialize(en, context, idType, id);
en.finishStructure();
}
}
};
}
@Override
public void serialize(Encoder encoder, EncoderContext context, Argument<? extends Object> type, Object value) throws IOException {
throw new IllegalStateException("Create specific call is required!");
}
};
return (D) oneRelationSerializer;
}
if (serializerClass == ManyRelationSerializer.class) {
ManyRelationSerializer manyRelationSerializer = new ManyRelationSerializer() {
@Override
public void serialize(Encoder encoder, EncoderContext context, Argument<?> type, Object value) throws IOException {
encoder.encodeNull();
}
};
return (D) manyRelationSerializer;
}
return defaultSerdeRegistry.findCustomSerializer(serializerClass);
}
Aggregations