
se.hiq.oss.spring.nats.message.serde.xml.JaxbMessageSerializer Maven / Gradle / Ivy
The newest version!
package se.hiq.oss.spring.nats.message.serde.xml;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.validation.Schema;
import se.hiq.oss.spring.nats.exception.SerializeException;
import se.hiq.oss.spring.nats.message.serde.NatsMessageSerializer;
import se.hiq.oss.spring.nats.message.validation.MessageObjectValidator;
public class JaxbMessageSerializer implements NatsMessageSerializer {
private Map, JAXBContext> contextsPerClass = new ConcurrentHashMap<>();
private Optional jaxbContext = Optional.empty();
private XmlSchemaFactory xmlSchemaFactory = new XmlSchemaFactory();
private Optional validator = Optional.empty();
@Override
public void setValidator(Optional validator) {
this.validator = validator;
}
public void setJaxbContext(Optional jaxbContext) {
this.jaxbContext = jaxbContext;
}
@Override
public byte[] toMessageData(Object object) throws SerializeException {
validator.filter(v -> v.shouldValidate(object.getClass())).ifPresent(v -> v.validate(object));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try (OutputStreamWriter osw = new OutputStreamWriter(bos, StandardCharsets.UTF_8)) {
JAXBContext context = jaxbContext.orElseGet(() -> loadContextFor(object.getClass()));
Marshaller marshaller = context.createMarshaller();
Optional schema = xmlSchemaFactory.schemaFor(object.getClass());
schema.ifPresent(s -> marshaller.setSchema(s));
marshaller.marshal(object, osw);
} catch (IOException | JAXBException e) {
throw new SerializeException("Could not serialize " + object + " to XML", e);
}
return bos.toByteArray();
}
private JAXBContext loadContextFor(Class> forType) {
JAXBContext jaxb = contextsPerClass.get(forType);
if (jaxb == null) {
try {
jaxb = JAXBContext.newInstance(forType);
contextsPerClass.put(forType, jaxb);
} catch (JAXBException e) {
throw new SerializeException("Could not serialize " + forType + " to XML", e);
}
}
return jaxb;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy