@Override protected void registerConverters(ChainingConverter converter) { converter.registerConverter(Dom4JToByteArrayConverter.class); converter.registerConverter(InputStreamToDom4jConverter.class); converter.registerConverter(XomToStringConverter.class); converter.registerConverter(InputStreamToXomConverter.class); }
private Serializer buildSerializer(RevisionResolver revisionResolver, SerializerProperties.SerializerType serializerType) { switch (serializerType) { case JACKSON: Map<String, ObjectMapper> objectMapperBeans = applicationContext.getBeansOfType(ObjectMapper.class); ObjectMapper objectMapper = objectMapperBeans.containsKey("defaultAxonObjectMapper") ? objectMapperBeans.get("defaultAxonObjectMapper") : objectMapperBeans.values().stream().findFirst() .orElseThrow(() -> new NoClassDefFoundError( "com/fasterxml/jackson/databind/ObjectMapper" )); ChainingConverter converter = new ChainingConverter(beanClassLoader); return JacksonSerializer.builder() .revisionResolver(revisionResolver) .converter(converter) .objectMapper(objectMapper) .build(); case JAVA: return JavaSerializer.builder().revisionResolver(revisionResolver).build(); case XSTREAM: case DEFAULT: default: XStreamSerializer xStreamSerializer = XStreamSerializer.builder() .revisionResolver(revisionResolver) .build(); xStreamSerializer.getXStream().setClassLoader(beanClassLoader); return xStreamSerializer; } }
@Override public boolean canConvert(Class<?> sourceType, Class<?> targetType) { if (sourceType.equals(targetType)) { return true; } for (ContentTypeConverter converter : converters) { if (canConvert(converter, sourceType, targetType)) { return true; } } return ChainedConverter.canConvert(sourceType, targetType, converters); }
/** * Registers converters with the given {@code converter} which depend on the actual contents of the * serialized for to represent a JSON format. * * @param converter The ChainingConverter instance to register the converters with. */ protected void registerConverters(ChainingConverter converter) { converter.registerConverter(new JsonNodeToByteArrayConverter(objectMapper)); converter.registerConverter(new ByteArrayToJsonNodeConverter(objectMapper)); }
/** * Initialize the serializer using the given {@code charset} and {@code xStream} instance. The * {@code xStream} instance is configured with several converters for the most common types in Axon. * * @param charset The character set to use * @param xStream The XStream instance to use * @param revisionResolver The strategy to use to resolve the revision of an object */ protected AbstractXStreamSerializer(Charset charset, XStream xStream, RevisionResolver revisionResolver) { this(charset, xStream, revisionResolver, new ChainingConverter()); }
@Override @SuppressWarnings("unchecked") public <T> T convert(Object original, Class<?> sourceType, Class<T> targetType) { if (sourceType.equals(targetType)) { return (T) original; } for (ContentTypeConverter converter : converters) { if (canConvert(converter, sourceType, targetType)) { return (T) converter.convert(original); } } ChainedConverter converter = ChainedConverter.calculateChain(sourceType, targetType, converters); converters.add(0, converter); return (T) converter.convert(original); }
/** * Registers a convert of the given {@code converterType} with this factory, only if initialization of such a * converter is possible. Both the expected source type and target type classes are checked for availability on the * class path. In contrast to {@link #registerConverter(ContentTypeConverter)}, this method allows potentially * unsafe (in terms of class dependencies) converters to be registered. * <p/> * The converter which is registered <em>last</em> will be inspected <em>first</em> when finding a suitable * converter for a given input and output type. * <p/> * An alternative to explicit converter registration (but without the ordering guarantees) is to create a file * called {@code org.axonframework.serialization.ContentTypeConverter} in {@code /META-INF/services/} on the * class path which contains the fully qualified class names of the converters, separated by newlines. These * implementations must have a public no-arg constructor. * * @param converterType the type of converter to register. */ public void registerConverter(Class<? extends ContentTypeConverter> converterType) { try { ContentTypeConverter converter = converterType.getConstructor().newInstance(); converter.targetType(); converter.expectedSourceType(); registerConverter(converter); } catch (Exception e) { logger.warn("An exception occurred while trying to initialize a [{}].", converterType.getName(), e); } catch (NoClassDefFoundError e) { logger.info("ContentTypeConverter of type [{}] is ignored. It seems to rely on a class that is " + "not available in the class loader: {}", converterType, e.getMessage()); } }
/** * Initialize the serializer with the given {@code objectMapper} to serialize and parse the objects to JSON. * This objectMapper allows for customization of the serialized form. The given {@code revisionResolver} is * used to resolve the revision from an object to be serialized. * * @param objectMapper The objectMapper to serialize objects and parse JSON with * @param revisionResolver The strategy to use to resolve the revision of an object */ public JacksonSerializer(ObjectMapper objectMapper, RevisionResolver revisionResolver) { this(objectMapper, revisionResolver, new ChainingConverter()); }
@Override public boolean canConvert(Class<?> sourceType, Class<?> targetType) { if (sourceType.equals(targetType)) { return true; } for (ContentTypeConverter converter : converters) { if (canConvert(converter, sourceType, targetType)) { return true; } } return ChainedConverter.canConvert(sourceType, targetType, converters); }
@Override protected void registerConverters(ChainingConverter converter) { converter.registerConverter(Dom4JToByteArrayConverter.class); converter.registerConverter(InputStreamToDom4jConverter.class); converter.registerConverter(XomToStringConverter.class); converter.registerConverter(InputStreamToXomConverter.class); } }
/** * Initialize the serializer with a default ObjectMapper instance. Revisions are resolved using {@link * org.axonframework.serialization.Revision @Revision} annotations on the serialized classes. */ public JacksonSerializer() { this(new AnnotationRevisionResolver(), new ChainingConverter()); }
@Override public boolean canConvert(Class<?> sourceType, Class<?> targetType) { if (sourceType.equals(targetType)) { return true; } for (ContentTypeConverter converter : converters) { if (canConvert(converter, sourceType, targetType)) { return true; } } return ChainedConverter.canConvert(sourceType, targetType, converters); }
@Override protected void registerConverters(ChainingConverter converter) { converter.registerConverter(Dom4JToByteArrayConverter.class); converter.registerConverter(InputStreamToDom4jConverter.class); converter.registerConverter(XomToStringConverter.class); converter.registerConverter(InputStreamToXomConverter.class); }
/** * Initialize the serializer using the given {@code charset} and {@code xStream} instance. The * {@code xStream} instance is configured with several converters for the most common types in Axon. * <p/> * An {@link AnnotationRevisionResolver} is used to resolve revision for serialized objects. * * @param charset The character set to use * @param xStream The XStream instance to use */ protected AbstractXStreamSerializer(Charset charset, XStream xStream) { this(charset, xStream, new AnnotationRevisionResolver(), new ChainingConverter()); }
@Override @SuppressWarnings("unchecked") public <T> T convert(Object original, Class<?> sourceType, Class<T> targetType) { if (sourceType.equals(targetType)) { return (T) original; } for (ContentTypeConverter converter : converters) { if (canConvert(converter, sourceType, targetType)) { return (T) converter.convert(original); } } ChainedConverter converter = ChainedConverter.calculateChain(sourceType, targetType, converters); converters.add(0, converter); return (T) converter.convert(original); }
@Override protected void registerConverters(ChainingConverter converter) { converter.registerConverter(new DBObjectToStringContentTypeConverter()); converter.registerConverter(new DocumentToStringContentTypeConverter()); converter.registerConverter(new StringToDBObjectContentTypeConverter()); }
/** * Initialize the serializer with the given {@code objectMapper} to serialize and parse the objects to JSON. * This objectMapper allows for customization of the serialized form. * * @param objectMapper The objectMapper to serialize objects and parse JSON with */ public JacksonSerializer(ObjectMapper objectMapper) { this(objectMapper, new AnnotationRevisionResolver(), new ChainingConverter()); }
@Override @SuppressWarnings("unchecked") public <T> T convert(Object original, Class<?> sourceType, Class<T> targetType) { if (sourceType.equals(targetType)) { return (T) original; } for (ContentTypeConverter converter : converters) { if (canConvert(converter, sourceType, targetType)) { return (T) converter.convert(original); } } ChainedConverter converter = ChainedConverter.calculateChain(sourceType, targetType, converters); converters.add(0, converter); return (T) converter.convert(original); }
/** * Registers converters with the given {@code converter} which depend on the actual contents of the * serialized for to represent a JSON format. * * @param converter The ChainingConverter instance to register the converters with. */ protected void registerConverters(ChainingConverter converter) { converter.registerConverter(new JsonNodeToByteArrayConverter(objectMapper)); converter.registerConverter(new ByteArrayToJsonNodeConverter(objectMapper)); }
private Serializer buildSerializer(RevisionResolver revisionResolver, SerializerProperties.SerializerType serializerType) { switch (serializerType) { case JACKSON: Map<String, ObjectMapper> objectMapperBeans = applicationContext.getBeansOfType(ObjectMapper.class); ObjectMapper objectMapper = objectMapperBeans.containsKey("defaultAxonObjectMapper") ? objectMapperBeans.get("defaultAxonObjectMapper") : objectMapperBeans.values().stream().findFirst() .orElseThrow(() -> new NoClassDefFoundError( "com/fasterxml/jackson/databind/ObjectMapper" )); ChainingConverter converter = new ChainingConverter(beanClassLoader); return JacksonSerializer.builder() .revisionResolver(revisionResolver) .converter(converter) .objectMapper(objectMapper) .build(); case JAVA: return JavaSerializer.builder().revisionResolver(revisionResolver).build(); case XSTREAM: case DEFAULT: default: XStreamSerializer xStreamSerializer = XStreamSerializer.builder() .revisionResolver(revisionResolver) .build(); xStreamSerializer.getXStream().setClassLoader(beanClassLoader); return xStreamSerializer; } }