JAXB аннотации для следующего XML - PullRequest
1 голос
/ 12 октября 2011

Я потратил некоторое время, пытаясь заставить это работать, но мне немного повезло.

У меня есть следующий XML:

<message>
  <buckets>
    <bucket>
      <channels>
         <channel>Test A</channel>
         <channel>Test B</channel>
      </channels>
      <messageText>This is sample text</messageText>
    </bucket>
    <bucket>
      ....
    </bucket>
  </buckets>
  <userId>10</userId>
 </message>

Я пытаюсь сопоставить это с POJO, используя аннотации JAXB, но у меня возникли проблемы.

Мой класс выглядит следующим образом:

@XmlRootElement(name="message")
public class MessageRS {

  public static class Bucket {
    private List<String>channels;
    private String text;

    private Bucket() {}

    public List<String> getChannels() { .... }
    public void setChannels(List<String> channels) { .... }
    public String getText() { .... }
    public void setText(String text) { .... }
  }

  private List<Bucket> buckets;

  private Long userId;

  private MessageRS() { }

  public List<Bucket getBuckets() { .... }
  public void setBuckets(List<Bucket> buckets) { .... }
  public long geUserId() { .... }
  public void setUserId(long UserId { .... }
}

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

Здесь ничего не установлено - я могу свободно изменять структуры классов XML и Java на этом этапе.

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Попробуйте это:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.List;

public class JaxbStuff {
    public static void main(String[] args) throws Exception {
        MessageRS message = new MessageRS();
        message.setUserId(10);
        MessageRS.Bucket bucket1 = new MessageRS.Bucket();
        bucket1.setText("This is sample text");
        bucket1.setChannels(Arrays.asList("Test A", "Test B"));
        MessageRS.Bucket bucket2 = new MessageRS.Bucket();
        bucket2.setText("Some more text");
        bucket2.setChannels(Arrays.asList("1", "2"));
        message.setBuckets(Arrays.asList(bucket1, bucket2));
        StringWriter writer = new StringWriter();
        JAXBContext.newInstance(MessageRS.class).createMarshaller().marshal(message, writer);
        System.out.println(writer);
    }

    @XmlRootElement(name = "message")
    static class MessageRS {

        public static class Bucket {
            private List<String> channels;
            private String text;

            private Bucket() {}

            @XmlElementWrapper(name = "channels")
            @XmlElement(name = "channel")
            public List<String> getChannels() {
                return channels;
            }

            public void setChannels(List<String> channels) {
                this.channels = channels;
            }

            public String getText() {
                return text;
            }

            public void setText(String text) {
                this.text = text;
            }
        }

        private List<Bucket> buckets;

        private Long userId;

        private MessageRS() { }

        public List<Bucket> getBuckets() {
            return buckets;
        }

        public void setBuckets(List<Bucket> buckets) {
            this.buckets = buckets;
        }

        public long getUserId() {
            return userId;
        }

        public void setUserId(long UserId) {
            this.userId = UserId;
        }
    }

}

У вас также была опечатка в getUserId(), из-за которой это свойство работало некорректно. Это было geUserId().

Также опасно смешивать Long и Long таким образом. Если ваш userId равен нулю и вы вызываете getUserId(), он выдаст исключение NullPointerException.

0 голосов
/ 12 октября 2011

Как правило, jaxb использует объекты-обертки вокруг списков. таким образом, у вас будет класс Buckets с List<Bucket> getBuckets(), а у вас будет класс Channels с List<Channel> getChannels(). я считаю, что есть дополнительные аннотации, которые вы можете использовать, чтобы избежать лишних классов-оболочек, но они используются не часто (по крайней мере, не обычными инструментами автоматической генерации).

лично я считаю, что гораздо проще написать схему XML и использовать xjc для генерации классов Java.

...