qsadfasdgfgads

Untitled

May 20th, 2023
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.03 KB | None | 0 0
  1.  
  2. package org.example;
  3.  
  4. import com.fasterxml.jackson.annotation.*;
  5. import com.fasterxml.jackson.core.JsonGenerator;
  6. import com.fasterxml.jackson.databind.*;
  7. import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
  8. import com.fasterxml.jackson.dataformat.xml.XmlMapper;
  9. import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
  10. import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
  11. import org.example.TextMessage;
  12.  
  13. import java.io.IOException;
  14. import java.io.Serializable;
  15.  
  16. public class Main {
  17. public static void main(String[] args) throws IOException {
  18. XmlMapper xmlMapper = new XmlMapper();
  19. xmlMapper.setSerializerFactory(xmlMapper.getSerializerFactory()
  20. .withSerializerModifier(new ServerMessageSerializerModifier()));
  21.  
  22. ServerMessage.LoginResponse loginResponse = new ServerMessage.LoginResponse(12345);
  23. String serializedLoginResponse = xmlMapper.writeValueAsString(loginResponse);
  24. System.out.println("Serialized LoginResponse: " + serializedLoginResponse);
  25. }
  26. }
  27.  
  28. @JacksonXmlRootElement(localName = "ServerMessage")
  29. @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
  30. @JsonSubTypes({
  31. @JsonSubTypes.Type(value = ServerMessage.LoginResponse.class, name = "login_response"),
  32. @JsonSubTypes.Type(value = ServerMessage.NewMessage.class, name = "new_message")
  33. })
  34. abstract class ServerMessage implements Serializable {
  35. public enum ErrorType {
  36. ERROR, SUCCESS
  37. }
  38.  
  39.  
  40. @JsonIgnore
  41. @JacksonXmlProperty(isAttribute = false)
  42. private final ErrorType errorType;
  43.  
  44. @JsonCreator
  45. protected ServerMessage(@JsonProperty("errorType") ErrorType errorType) {
  46. this.errorType = errorType != null ? errorType : ErrorType.SUCCESS;
  47. }
  48. @JsonIgnore
  49. public ErrorType getErrorType() {
  50. return errorType;
  51. }
  52.  
  53. public static final class LoginResponse extends ServerMessage {
  54. private final int sessionID;
  55.  
  56. public LoginResponse(int sessionId) {
  57. super(ErrorType.SUCCESS);
  58. this.sessionID = sessionId;
  59. }
  60.  
  61. @JsonCreator(mode = JsonCreator.Mode.DISABLED)
  62. public LoginResponse() {
  63. super(ErrorType.SUCCESS);
  64. this.sessionID = 0; // or any default value you prefer
  65. }
  66.  
  67. @JsonProperty("sessionID")
  68. @JacksonXmlProperty(localName = "sessionID")
  69. public int getSessionID() {
  70. return sessionID;
  71. }
  72. }
  73.  
  74. public static final class NewMessage extends ServerMessage {
  75. private TextMessage message;
  76.  
  77. public NewMessage() {
  78. super(ErrorType.SUCCESS);
  79. }
  80.  
  81. public NewMessage(TextMessage message) {
  82. super(ErrorType.SUCCESS);
  83. this.message = message;
  84. }
  85.  
  86. @JsonProperty("message")
  87. @JacksonXmlProperty(localName = "message")
  88. public TextMessage getMessage() {
  89. return message;
  90. }
  91. }
  92.  
  93. public static String serialize(ServerMessage message) throws IOException {
  94. XmlMapper xmlMapper = new XmlMapper();
  95. return xmlMapper.writer().withRootName(message.getErrorType().name()).writeValueAsString(message);
  96. }
  97.  
  98. public static ServerMessage deserialize(String xml) throws IOException {
  99. XmlMapper xmlMapper = new XmlMapper();
  100. xmlMapper.registerSubtypes(LoginResponse.class, NewMessage.class);
  101. xmlMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
  102. return xmlMapper.readValue(xml, ServerMessage.class);
  103. }
  104. }
  105.  
  106. class ServerMessageSerializerModifier extends BeanSerializerModifier {
  107. @Override
  108. public JsonSerializer<?> modifySerializer(
  109. SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
  110. if (ServerMessage.class.isAssignableFrom(beanDesc.getBeanClass())) {
  111. return new ServerMessageSerializer((JsonSerializer<Object>) serializer);
  112. }
  113. return serializer;
  114. }
  115. }
  116.  
  117. class ServerMessageSerializer extends JsonSerializer<Object> {
  118. private final JsonSerializer<Object> defaultSerializer;
  119.  
  120. ServerMessageSerializer(JsonSerializer<Object> defaultSerializer) {
  121. this.defaultSerializer = defaultSerializer;
  122. }
  123.  
  124. @Override
  125. public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
  126. if (value instanceof ServerMessage serverMessage) {
  127. gen.writeStartObject();
  128. gen.writeObjectField("errorType", serverMessage.getErrorType());
  129. defaultSerializer.unwrappingSerializer(null).serialize(value, gen, serializers);
  130. gen.writeEndObject();
  131. } else {
  132. defaultSerializer.serialize(value, gen, serializers);
  133. }
  134. }
  135. }
  136.  
  137. 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)
  138. at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
  139. at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1312)
  140. at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:414)
  141. at com.fasterxml.jackson.databind.JsonSerializer.serializeWithType(JsonSerializer.java:160)
  142. at com.fasterxml.jackson.databind.ser.impl.TypeWrappedSerializer.serialize(TypeWrappedSerializer.java:32)
  143. at com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider.serializeValue(XmlSerializerProvider.java:108)
  144. at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4719)
  145. at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3964)
  146. at org.example.Main.main(Main.java:22)
  147. Suppressed: com.fasterxml.jackson.core.JsonGenerationException: Trying to write END_DOCUMENT when document has no root (ie. trying to output empty document).
  148. at com.fasterxml.jackson.dataformat.xml.util.StaxUtil.throwAsGenerationException(StaxUtil.java:35)
  149. at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.close(ToXmlGenerator.java:1357)
  150. at com.fasterxml.jackson.databind.util.ClassUtil.closeOnFailAndThrowAsIOE(ClassUtil.java:496)
  151. at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4721)
  152. ... 2 more
  153. Caused by: javax.xml.stream.XMLStreamException: Trying to write END_DOCUMENT when document has no root (ie. trying to output empty document).
  154. at com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1596)
  155. at com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1625)
  156. at com.ctc.wstx.sw.BaseStreamWriter._finishDocument(BaseStreamWriter.java:1451)
  157. at com.ctc.wstx.sw.BaseStreamWriter.closeCompletely(BaseStreamWriter.java:933)
  158. at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.close(ToXmlGenerator.java:1352)
  159. ... 4 more
  160.  
Advertisement
Add Comment
Please, Sign In to add comment