@XmlRootElement в классе, но не в XML - PullRequest
0 голосов
/ 07 июня 2019

У меня есть класс, который я использую для генерации полезной нагрузки xml из:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "someName", propOrder = {
    "one",
    "two"
})
@XmlRootElement(name = "test")
public class MyClass {
    @XmlElement
    protected String one;
    @XmlElement
    protected String two;
    ...
}

С помощью метода фабрики объектов следующим образом

@XmlElementDecl("Something")
public JAXBElement<MyClass> getMyClassXml(MyClass value) {
  return new JAXBElement<MyClass>(_Something_QNAME, MyClass.class, null, value);

}

Я бы хотел, чтобы в теле мыла содержалось

<Something>
    <test>
        <one>1</one>
        <two>2</two>
    </test>
</Something>

, но я получаю

<Something>
    <one>1</one>
    <two>2</two>
</Something>

Кто-нибудь сталкивался с чем-то подобным?

Ответы [ 4 ]

0 голосов
/ 13 июня 2019

Я решил это, изменив класс xml, который wsimport сгенерировал следующим образом:

// @XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "someName"/*, propOrder = {
    "one",
    "two"
} */ )
// @XmlRootElement(name = "test")
@XmlAccessorType(XmlAccessType.NONE)
public class MyClass {
    // @XmlElement
    protected String one;
    // @XmlElement
    protected String two;
    ...

    // my own custom wrapper
    @XmlElement
    protected MyClassWrapper test = new MyClassWrapper(this);
}

Где моя оболочка выглядит примерно так:

@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "someNameWrapper", propOrder = {
        "one",
        "two"
})
public class MyClassWrapper {
    public MyClassWrapper() {}
    public MyClassWrapper(MyClass base) {
        this.base = base;
    }
    @XmlElement
    public getOne() { return base.getOne(); }
    @XmlElement
    public getTwo() { return base.getTwo(); }
}
0 голосов
/ 07 июня 2019

Вы можете попробовать следующий код.

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

@XmlAccessorType(XmlAccessType.FIELD)
public class MyClass {

    @XmlElement
    protected String one;
    @XmlElement
    protected String two;

    public String getOne() {
        return one;
    }

    public void setOne(String one) {
        this.one = one;
    }

    public String getTwo() {
        return two;
    }

    public void setTwo(String two) {
        this.two = two;
    }
}



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

@XmlRootElement(name = "Something")
@XmlAccessorType(XmlAccessType.FIELD)
public class Something {

  @XmlElement(name = "test")
  private MyClass testClass;

  public MyClass getTestClass() {
    return testClass;
  }

  public void setTestClass(MyClass testClass) {
    this.testClass = testClass;
  }
}

Тестовый класс для проверки.

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Test {
  public static void main(String[] args) throws Exception {
    MyClass testClass = new MyClass();
    testClass.setOne("1");
    testClass.setTwo("2");
    Something something = new Something();
    something.setTestClass(testClass);

    JAXBContext jaxbContext = JAXBContext.newInstance(Something.class);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    jaxbMarshaller.marshal(something, System.out);
  }
}

После запуска тестового класса вы найдете следующую структуру xml.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Something>
    <test>
        <one>1</one>
        <two>2</two>
    </test>
</Something>

Итак, в вашем случае что-то должно содержать MyClass как вложенный объект для генерации желаемой XML-структуры с использованием Jaxb.

0 голосов
/ 09 июня 2019

попробуйте с этим,

Something.java

@XmlRootElement
public class Something {

    @XmlElement(name = "test")
    private List<Test> testList;

    public List<Test> getTestList() {
        return testList;
    }

    public void setTestList(List<Test> testList) {
        this.testList = testList;
    }
}

Test.java

@XmlRootElement(name = "test")
public class Test {

    @XmlElement
    private String one;
    @XmlElement
    private String two;

    public String getOne() {
        return one;
    }

    public void setOne(String one) {
        this.one = one;
    }

    public String getTwo() {
        return two;
    }

    public void setTwo(String two) {
        this.two = two;
    }
}

Маршаллинг с JAXB

//Create a test
Test test = new Test();
test.setOne("1");
test.setTwo("2");

//Create a something
Something something = new Something();
//Add test into the testList of something
something.getTestList().add(test);

JAXBContext jaxbContext = JAXBContext.newInstance(Something.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

jaxbMarshaller.marshal(something, new File("something.xml"));

что-то.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Something>
    <test>
        <one>1</one>
        <two>2</two>
    </test>
</Something>
0 голосов
/ 07 июня 2019

Если вы поместите свой класс в список, а затем сохраните этот список в XML, он получится похожим на то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...