Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package org.example;
- import com.fasterxml.jackson.annotation.*;
- import com.fasterxml.jackson.core.JsonGenerator;
- import com.fasterxml.jackson.databind.*;
- import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
- import com.fasterxml.jackson.dataformat.xml.XmlMapper;
- import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
- import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
- import org.example.TextMessage;
- import java.io.IOException;
- import java.io.Serializable;
- public class Main {
- public static void main(String[] args) throws IOException {
- XmlMapper xmlMapper = new XmlMapper();
- xmlMapper.setSerializerFactory(xmlMapper.getSerializerFactory()
- .withSerializerModifier(new ServerMessageSerializerModifier()));
- ServerMessage.LoginResponse loginResponse = new ServerMessage.LoginResponse(12345);
- String serializedLoginResponse = xmlMapper.writeValueAsString(loginResponse);
- System.out.println("Serialized LoginResponse: " + serializedLoginResponse);
- }
- }
- @JacksonXmlRootElement(localName = "ServerMessage")
- @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
- @JsonSubTypes({
- @JsonSubTypes.Type(value = ServerMessage.LoginResponse.class, name = "login_response"),
- @JsonSubTypes.Type(value = ServerMessage.NewMessage.class, name = "new_message")
- })
- abstract class ServerMessage implements Serializable {
- public enum ErrorType {
- ERROR, SUCCESS
- }
- @JsonIgnore
- @JacksonXmlProperty(isAttribute = false)
- private final ErrorType errorType;
- @JsonCreator
- protected ServerMessage(@JsonProperty("errorType") ErrorType errorType) {
- this.errorType = errorType != null ? errorType : ErrorType.SUCCESS;
- }
- @JsonIgnore
- public ErrorType getErrorType() {
- return errorType;
- }
- public static final class LoginResponse extends ServerMessage {
- private final int sessionID;
- public LoginResponse(int sessionId) {
- super(ErrorType.SUCCESS);
- this.sessionID = sessionId;
- }
- @JsonCreator(mode = JsonCreator.Mode.DISABLED)
- public LoginResponse() {
- super(ErrorType.SUCCESS);
- this.sessionID = 0; // or any default value you prefer
- }
- @JsonProperty("sessionID")
- @JacksonXmlProperty(localName = "sessionID")
- public int getSessionID() {
- return sessionID;
- }
- }
- public static final class NewMessage extends ServerMessage {
- private TextMessage message;
- public NewMessage() {
- super(ErrorType.SUCCESS);
- }
- public NewMessage(TextMessage message) {
- super(ErrorType.SUCCESS);
- this.message = message;
- }
- @JsonProperty("message")
- @JacksonXmlProperty(localName = "message")
- public TextMessage getMessage() {
- return message;
- }
- }
- public static String serialize(ServerMessage message) throws IOException {
- XmlMapper xmlMapper = new XmlMapper();
- return xmlMapper.writer().withRootName(message.getErrorType().name()).writeValueAsString(message);
- }
- public static ServerMessage deserialize(String xml) throws IOException {
- XmlMapper xmlMapper = new XmlMapper();
- xmlMapper.registerSubtypes(LoginResponse.class, NewMessage.class);
- xmlMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
- return xmlMapper.readValue(xml, ServerMessage.class);
- }
- }
- class ServerMessageSerializerModifier extends BeanSerializerModifier {
- @Override
- public JsonSerializer<?> modifySerializer(
- SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
- if (ServerMessage.class.isAssignableFrom(beanDesc.getBeanClass())) {
- return new ServerMessageSerializer((JsonSerializer<Object>) serializer);
- }
- return serializer;
- }
- }
- class ServerMessageSerializer extends JsonSerializer<Object> {
- private final JsonSerializer<Object> defaultSerializer;
- ServerMessageSerializer(JsonSerializer<Object> defaultSerializer) {
- this.defaultSerializer = defaultSerializer;
- }
- @Override
- public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
- if (value instanceof ServerMessage serverMessage) {
- gen.writeStartObject();
- gen.writeObjectField("errorType", serverMessage.getErrorType());
- defaultSerializer.unwrappingSerializer(null).serialize(value, gen, serializers);
- gen.writeEndObject();
- } else {
- defaultSerializer.serialize(value, gen, serializers);
- }
- }
- }
- Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Type id handling not implemented for type org.example.ServerMessage$LoginResponse (by serializer of type org.example.ServerMessageSerializer)
- at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
- at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1312)
- at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:414)
- at com.fasterxml.jackson.databind.JsonSerializer.serializeWithType(JsonSerializer.java:160)
- at com.fasterxml.jackson.databind.ser.impl.TypeWrappedSerializer.serialize(TypeWrappedSerializer.java:32)
- at com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider.serializeValue(XmlSerializerProvider.java:108)
- at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4719)
- at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3964)
- at org.example.Main.main(Main.java:22)
- Suppressed: com.fasterxml.jackson.core.JsonGenerationException: Trying to write END_DOCUMENT when document has no root (ie. trying to output empty document).
- at com.fasterxml.jackson.dataformat.xml.util.StaxUtil.throwAsGenerationException(StaxUtil.java:35)
- at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.close(ToXmlGenerator.java:1357)
- at com.fasterxml.jackson.databind.util.ClassUtil.closeOnFailAndThrowAsIOE(ClassUtil.java:496)
- at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4721)
- ... 2 more
- Caused by: javax.xml.stream.XMLStreamException: Trying to write END_DOCUMENT when document has no root (ie. trying to output empty document).
- at com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1596)
- at com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1625)
- at com.ctc.wstx.sw.BaseStreamWriter._finishDocument(BaseStreamWriter.java:1451)
- at com.ctc.wstx.sw.BaseStreamWriter.closeCompletely(BaseStreamWriter.java:933)
- at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.close(ToXmlGenerator.java:1352)
- ... 4 more
Advertisement
Add Comment
Please, Sign In to add comment