Java 以下XML的JAXB注释

Java 以下XML的JAXB注释,java,xml,annotations,jaxb,pojo,Java,Xml,Annotations,Jaxb,Pojo,我花了一段时间试图让这项工作,但我没有什么运气 我有以下XML: <message> <buckets> <bucket> <channels> <channel>Test A</channel> <channel>Test B</channel> </channels> <messageText&g

我花了一段时间试图让这项工作,但我没有什么运气

我有以下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>

测试A
测试B
这是示例文本
....
10
我试图使用JAXB注释将其映射到POJO,但遇到了问题

我的班级如下:

@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 { .... }
}
@XmlRootElement(name=“message”)
公共类消息传递者{
公共静态类Bucket{
私人频道;
私有字符串文本;
私有存储桶(){}
公共列表getChannels(){..}
公共无效设置通道(列出通道){….}
公共字符串getText(){..}
公共void setText(字符串文本){….}
}
私有列表存储桶;
私有长用户ID;
私有消息(){}

public List通常,jaxb在列表周围使用包装器对象。因此,您将有一个bucket类,它具有
List getbucket()
,还有一个Channels类,它具有
List getChannels()
。我相信您可以使用额外的注释来避免额外的包装器类,但它们并不经常使用(至少不是通过常用的自动生成工具)

就我个人而言,我发现编写xml模式并使用xjc生成java类要简单得多。

试试以下方法:

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;
        }
    }

}
import javax.xml.bind.JAXBContext;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlElementWrapper;
导入javax.xml.bind.annotation.XmlRootElement;
导入java.io.StringWriter;
导入java.util.array;
导入java.util.List;
公共类JaxbStuff{
公共静态void main(字符串[]args)引发异常{
MessageRS message=新的MessageRS();
message.setUserId(10);
MessageRS.Bucket bucket1=新MessageRS.Bucket();
bucket1.setText(“这是示例文本”);
bucket1.setChannels(数组.asList(“测试A”,“测试B”));
MessageRS.Bucket bucket2=新MessageRS.Bucket();
bucket2.setText(“更多文本”);
bucket2.setChannels(数组.asList(“1”、“2”));
message.setbuckts(Arrays.asList(bucket1,bucket2));
StringWriter编写器=新的StringWriter();
JAXBContext.newInstance(messages.class).createMarshaller().marshal(message,writer);
System.out.println(writer);
}
@XmlRootElement(name=“message”)
静态类消息器{
公共静态类Bucket{
私人列表频道;
私有字符串文本;
私有存储桶(){}
@XmlElementWrapper(name=“channels”)
@xmlement(name=“channel”)
公共列表getChannels(){
返回通道;
}
公共频道(列出频道){
这个。通道=通道;
}
公共字符串getText(){
返回文本;
}
公共void setText(字符串文本){
this.text=文本;
}
}
私有列表存储桶;
私有长用户ID;
私有消息(){}
公共列表getbucket(){
返回铲斗;
}
公共无效收进(列出存储桶){
这个。桶=桶;
}
公共长getUserId(){
返回用户标识;
}
public void setUserId(长UserId){
this.userId=userId;
}
}
}
您在
getUserId()
中还有一个输入错误,这会使该属性无法正常工作。它是
geUserId()


此外,将Long和Long这样混合是危险的。如果您的userId为null,并且您调用
getUserId()
,它将抛出NullPointerException。

“不常用”?根据谁的说法?创建您自己的集合类的唯一好理由是如果您需要它们作为根元素。这里不是这种情况。“不常用”xjc没有使用该注释,我使用的大部分jaxb代码都是自动生成的(通常由xjc生成).啊,我明白了。我完全站在硬币的另一边。我从来没有使用过xjc。我只是在泽西岛使用JAXB进行编组/取消编组。允许使用私有构造函数。很好的调用。我不知道为什么我认为这适用于JAXB。是的,实际代码在另一台PC上,所以我只是在编辑器中再次键入它…无论如何,您的解决方案在还将XMLElementWrapper和XMLElement属性添加到getBucket()方法中。