Использование XStream для десериализации XML-ответа с отдельными формами «успех» и «сбой»? - PullRequest
0 голосов
/ 19 мая 2010

Я планирую использовать XStream с Java для преобразования между объектами и XML-запросами, а также XML-ответами и объектами, где XML передается по HTTP / HTTPS. Со стороны ответа я могу получить «успешный» ответ, который выглядит так, как если бы он отображался на один класс Java, или ответ «сбой», который выглядит так, как будто он сопоставлен с другим классом Java.

Например, для запроса «списка файлов» я могу получить утвердительный ответ, например,

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <success>true</success>
  <files>
    <file>[...]</file>
    <file>[...]</file>
    <file>[...]</file>
  </files>
</response>

или я могу получить отрицательный ответ, например,

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <success>false</success>
  <error>
    <errorCode>-502</errorCode>
    <systemMessage>[...]AuthenticationException</systemMessage>
    <userMessage>Not authenticated</userMessage>
  </error>
</response>

Чтобы справиться с этим, следует ли включать поля в одном классе для обоих случаев или я должен каким-то образом использовать XStream для «условного» создания одного из двух потенциальных классов?

Случай с полями из обоих вариантов ответа в одном и том же объекте будет выглядеть примерно так:

Class Response {
  boolean success;
  ArrayList<File> files;
  ResponseError error;
  [...]
}

Class File {
  String name;
  long size;
  [...]
}

Class ResponseError {
  int errorCode;
  String systemMessage;
  String userMessage;
  [...]
}

Я не знаю, как выглядит «использовать XStream и создавать разные объекты в случае успеха или ошибки». Можно ли это как-то сделать? Это лучший или худший путь?

В любом случае, любые советы о том, как справиться с использованием XStream, чтобы справиться с этим случаем «успех / отказ», будут приветствоваться. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 26 мая 2010

На самом деле, работая с этим, я обнаружил, что первый случай (включая поля в одном классе для обоих случаев), кажется, работает просто отлично, так что, возможно, это путь.

Это тот случай, когда как успешные, так и неудачные формы Response устанавливают поле success, а в случае неудачного возвращается ResponseError.

Class Response {
  boolean success;
  ArrayList<File> files;
  ResponseError error;
  [...]
}

Class File {
  String name;
  long size;
  [...]
}

Class ResponseError {
  int errorCode;
  String systemMessage;
  String userMessage;
  [...]
}
0 голосов
/ 19 мая 2010

Я использовал XStream только кратко и несколько лет назад, но если вам нужны два разных класса, почему бы не использовать два разных корневых тега (например, success и fail) для двух случаев?

Если вы также генерируете XML с помощью XStream, классы могут иметь общий базовый класс или интерфейс, если это необходимо для работы на стороне сервера.

...