Маршал внутренний класс с JAXB - Java - PullRequest
1 голос
/ 27 ноября 2011

Я следовал следующему руководству по JAXB http://blog.adamsbros.org/2010/02/07/jaxb-example-code/, и хотел изменить его, чтобы включить в него класс, который я хочу, как вложенный (внутренний) класс, следующим образом:

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.annotation.*; 
import java.io.StringReader; 
import java.io.StringWriter; 

public class HighlevelClass
{


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

    @XmlAttribute
    public int id;

    @XmlElement
    public
    String firstName;

    @XmlElement
    public
    String middleName;

    @XmlElement
    public
    String lastName;

    public Employee()
    {
    }

}

public static void main(String args[]) throws JAXBException
{

    HighlevelClass HClass = new HighlevelClass();
    Employee john = HClass.new Employee();
    john.firstName = "John";
    john.middleName = "Robert";
    john.lastName = "Doe";
    john.id = 1;

    // write it out as XML
    final JAXBContext jaxbContext = JAXBContext.newInstance(HighlevelClass.Employee.class);
}

Но в последней строке выдается ошибка, когда я пытаюсь создать контекст JAXB. Я пробовал несколько комбинаций, но компилировал их только тогда, когда сделал класс Employee статическим. Может кто-нибудь, пожалуйста, помогите мне понять, что происходит не так.

Спасибо.

1 Ответ

5 голосов
/ 27 ноября 2011

main() метод является статическим, поэтому он может получить доступ только к статическим членам вашего класса. Это не проблема JAXB. Так работает язык.

Внутренний класс является своего рода членом. Нестатический внутренний класс может вызывать нестатические методы внешнего класса, т. Е. Может обращаться к экземпляру внешнего класса (напрямую, используя 'HighlevelClass.this' или напрямую, вызывая методы или получая доступ к полям).

Вот почему вы должны определить свой внутренний класс как статический. Если вы не хотите этого делать, вы можете либо сделать свой класс обычным классом верхнего уровня, либо переместить свой jaxb-код в метод экземпляра и создать экземпляр своего класса перед его использованием:

public static void main(String args[]) throws JAXBException {
    new HighlevelClass().jaxbTest();
}


private void jaxbTest() throws JAXBException {

    HighlevelClass HClass = new HighlevelClass();
    Employee john = HClass.new Employee();
    john.firstName = "John";
    john.middleName = "Robert";
    john.lastName = "Doe";
    john.id = 1;

    // write it out as XML
    final JAXBContext jaxbContext = JAXBContext.newInstance(HighlevelClass.Employee.class);
}
...