qsadfasdgfgads

Untitled

May 20th, 2023
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.13 KB | None | 0 0
  1. package org.example;
  2.  
  3. import com.fasterxml.jackson.annotation.*;
  4. import com.fasterxml.jackson.core.JsonGenerator;
  5. import com.fasterxml.jackson.core.JsonToken;
  6. import com.fasterxml.jackson.core.type.WritableTypeId;
  7. import com.fasterxml.jackson.databind.*;
  8. import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
  9. import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
  10. import com.fasterxml.jackson.databind.ser.std.StdSerializer;
  11. import com.fasterxml.jackson.dataformat.xml.XmlMapper;
  12. import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
  13. import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
  14. import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;
  15. import org.example.TextMessage;
  16.  
  17. import java.io.IOException;
  18. import java.io.Serializable;
  19.  
  20. public class Main {
  21. public static void main(String[] args) throws IOException {
  22. XmlMapper xmlMapper = new XmlMapper();
  23. xmlMapper.setSerializerFactory(xmlMapper.getSerializerFactory()
  24. .withSerializerModifier(new ServerMessageSerializerModifier()));
  25.  
  26. ServerMessage.LoginResponse loginResponse = new ServerMessage.LoginResponse(12345);
  27. String serializedLoginResponse = xmlMapper.writeValueAsString(loginResponse);
  28. System.out.println("Serialized LoginResponse: " + serializedLoginResponse);
  29. }
  30. }
  31.  
  32. @JacksonXmlRootElement(localName = "ServerMessage")
  33. @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
  34. @JsonSubTypes({
  35. @JsonSubTypes.Type(value = ServerMessage.LoginResponse.class, name = "login_response"),
  36. @JsonSubTypes.Type(value = ServerMessage.NewMessage.class, name = "new_message")
  37. })
  38. abstract class ServerMessage implements Serializable {
  39. public enum ErrorType {
  40. ERROR, SUCCESS
  41. }
  42.  
  43.  
  44. @JsonIgnore
  45. @JacksonXmlProperty(isAttribute = false)
  46. private final ErrorType errorType;
  47.  
  48. @JsonCreator
  49. protected ServerMessage(@JsonProperty("errorType") ErrorType errorType) {
  50. this.errorType = errorType != null ? errorType : ErrorType.SUCCESS;
  51. }
  52. @JsonIgnore
  53. public ErrorType getErrorType() {
  54. return errorType;
  55. }
  56.  
  57. public static final class LoginResponse extends ServerMessage {
  58. private final int sessionID;
  59.  
  60. public LoginResponse(int sessionId) {
  61. super(ErrorType.SUCCESS);
  62. this.sessionID = sessionId;
  63. }
  64.  
  65. @JsonCreator(mode = JsonCreator.Mode.DISABLED)
  66. public LoginResponse() {
  67. super(ErrorType.SUCCESS);
  68. this.sessionID = 0; // or any default value you prefer
  69. }
  70.  
  71. @JsonProperty("sessionID")
  72. @JacksonXmlProperty(localName = "sessionID")
  73. public int getSessionID() {
  74. return sessionID;
  75. }
  76. }
  77.  
  78. public static final class NewMessage extends ServerMessage {
  79. private TextMessage message;
  80.  
  81. public NewMessage() {
  82. super(ErrorType.SUCCESS);
  83. }
  84.  
  85. public NewMessage(TextMessage message) {
  86. super(ErrorType.SUCCESS);
  87. this.message = message;
  88. }
  89.  
  90. @JsonProperty("message")
  91. @JacksonXmlProperty(localName = "message")
  92. public TextMessage getMessage() {
  93. return message;
  94. }
  95. }
  96.  
  97. public static String serialize(ServerMessage message) throws IOException {
  98. XmlMapper xmlMapper = new XmlMapper();
  99. return xmlMapper.writer().withRootName(message.getErrorType().name()).writeValueAsString(message);
  100. }
  101.  
  102. public static ServerMessage deserialize(String xml) throws IOException {
  103. XmlMapper xmlMapper = new XmlMapper();
  104. xmlMapper.registerSubtypes(LoginResponse.class, NewMessage.class);
  105. xmlMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
  106. return xmlMapper.readValue(xml, ServerMessage.class);
  107. }
  108. }
  109.  
  110. class ServerMessageSerializerModifier extends BeanSerializerModifier {
  111. @Override
  112. public JsonSerializer<?> modifySerializer(
  113. SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
  114. if (ServerMessage.class.isAssignableFrom(beanDesc.getBeanClass())) {
  115. return new ServerMessageSerializer((JsonSerializer<Object>) serializer);
  116. }
  117. return serializer;
  118. }
  119. }
  120.  
  121.  
  122. class ServerMessageSerializer extends JsonSerializer<Object> {
  123. private final StdSerializer<?> defaultSerializer;
  124. private final XmlMapper xmlMapper;
  125.  
  126. ServerMessageSerializer(StdSerializer<?> defaultSerializer, XmlMapper xmlMapper) {
  127. this.defaultSerializer = defaultSerializer;
  128. this.xmlMapper = xmlMapper;
  129. }
  130.  
  131. @Override
  132. public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
  133. if (value instanceof ServerMessage serverMessage) {
  134. gen.writeStartObject();
  135. gen.writeObjectField("errorType", serverMessage.getErrorType());
  136.  
  137. // Start the object for the current field
  138. gen.writeFieldName(gen.getOutputContext().getCurrentName());
  139. gen.writeStartObject();
  140.  
  141. // Convert the object to XML and write it using the XML generator
  142. String xml = xmlMapper.writeValueAsString(value);
  143. ToXmlGenerator xmlGenerator = (ToXmlGenerator) gen;
  144. xmlGenerator.writeRaw(xml);
  145.  
  146. gen.writeEndObject(); // End the object for the current field
  147. gen.writeEndObject();
  148. } else {
  149. defaultSerializer.serialize(value, gen, serializers);
  150. }
  151. }
  152. }
  153.  
  154.  
  155. java: constructor ServerMessageSerializer in class org.example.ServerMessageSerializer cannot be applied to given types;
  156. required: com.fasterxml.jackson.databind.ser.std.StdSerializer<?>,com.fasterxml.jackson.dataformat.xml.XmlMapper
  157. found: com.fasterxml.jackson.databind.JsonSerializer<java.lang.Object>
  158. reason: actual and formal argument lists differ in length
  159.  
  160.  
  161. 149:41 defaultSerializer.serialize(value, gen, serializers);
  162. java: incompatible types: java.lang.Object cannot be converted to capture#1 of ?
  163.  
Advertisement
Add Comment
Please, Sign In to add comment