package ameba.db.ebean.jackson; import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; import com.fasterxml.jackson.databind.ser.Serializers; import com.fasterxml.jackson.databind.type.CollectionType; import io.ebean.text.json.JsonContext; import org.glassfish.hk2.api.ServiceLocator; import javax.inject.Inject; import java.util.Collection; /** * Finds JsonSerializer's for entity bean types or entity bean collection types. */ class FindSerializers extends Serializers.Base { private final JsonContext jsonContext; @Inject private ServiceLocator locator; FindSerializers(JsonContext jsonContext) { this.jsonContext = jsonContext; } /** * {@inheritDoc} */ @Override public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType type, BeanDescription beanDesc) { if (jsonContext.isSupportedType(type.getRawClass())) { return createSerializer(); } return null; } /** {@inheritDoc} */ @Override public JsonSerializer<?> findCollectionSerializer(SerializationConfig config, CollectionType type, BeanDescription beanDesc, TypeSerializer elementTypeSerializer, JsonSerializer<Object> elementValueSerializer) { if (Collection.class.isAssignableFrom(type.getRawClass()) && jsonContext.isSupportedType(type.getContentType().getRawClass())) { return createSerializer(); } return null; } private JsonSerializer createSerializer() { JsonSerializer serializer = new CommonBeanSerializer(jsonContext); locator.inject(serializer); locator.postConstruct(serializer); return serializer; } }