2010-04-08 2 views
2

У меня есть следующее поле в моем классе:Castor: как отобразить простой список строк?

private List<String> messages; 

Вот отображение у меня есть:

<field name="messages" collection="arraylist" type="string" container="false> 
    <bind-xml name="errors" node="element"/> 
</field> 

Это то, что я получаю в результате сортировочных:

<errors><string>message1</string><string>message2</string></errors> 

И это то, чего я хочу достичь:

<errors><error>message1</error><error>message2</error></errors> 

Любая помощь приветствуется!

ответ

2

Есть ли причина, по которой вы используете Marshalling для достижения этой цели? Он будет иметь заданный способ определения выходного файла XML, чтобы он знал, как воссоздавать объекты при unmarshalling. Так что если вы действительно хотите, что выход XML с помощью маршалинг я думаю, что вам нужно будет создать новый тип называется ошибка, и список будет:

private List<Error> messages; 

И отображение:

<field name="messages" collection="arraylist" type="error" container="false> 
    <bind-xml name="errors" node="element"/> 
</field> 

В качестве альтернативы, если вы просто ищут создание xml-вывода, и ваш контент на самом деле так же прост, как вы указали выше, тогда вы можете просто написать метод toXml(), который перебирает список, добавляя контент точно так, как вы этого хотите. Обратный может быть выполнен с помощью метода fromXml(), который анализирует XML с использованием DOM или SAX и перестраивает список строк.

+0

Спасибо, Дейв, за подтверждение моих результатов, что я не могу сделать с Кастором. В нашем проекте мы используем Castor для визуализации представлений XML (объект домена -> XML). Обычно наш контент не такой простой, я просто добавлял сопоставление для объекта, в котором были отправлены сообщения об ошибках, которые представлены пользователю. Я до сих пор не могу поверить, что это просто невозможно! – Dmitriy

1

Почему бы не использовать JAXB?

import java.util.List; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

    @XmlRootElement 
    public class Errors { 

     private List<String> messages; 

     @XmlElement(name="error") 
     public List<String> getMessages() { 
      return messages; 
     } 

     public void setMessages(List<String> messages) { 
      this.messages = messages; 
     } 

    } 

Если вам нравится внешний связывающий файл, который вы можете использовать EclipseLink JAXB (MOXy):

<?xml version="1.0" encoding="UTF-8"?> 
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"> 
    <java-types> 
     <java-type name="Errors"> 
      <xml-root-element/> 
      <java-attributes> 
       <xml-element java-attribute="messages" name="error"/> 
      </java-attributes> 
     </java-type> 
    </java-types> 
</xml-bindings> 
0

Я знаю, что это было предложен давно, но вы можете рассмотреть возможность использования container="true".

+0

любые рекомендации, почему их использовать? –

+0

В документации Castor гораздо лучше объясняется, что делает атрибут контейнера. Для получения дополнительной информации см. Таблицу 1.10 [документ привязки данных Castor] (https://castor-data-binding.github.io/castor/reference-guides/1.3.3/html/XML%20data%20binding.html). Вообще говоря, каждый раз, когда вы используете класс коллекции для хранения кучи объектов, вы не хотите, чтобы Castor сохранял класс коллекции как таковой, а только вещи, хранящиеся внутри него. Полученный XML немного чище. ИМХО. –

Смежные вопросы