Estoy tratando de marshall varios objetos, por ejemplo, Book añadido en BookLists a través de setBookslst(). Que comenzar a usar este JAXBContext de instalación:

jaxbContext = JAXBContext.newInstance(BookLists.class);

y

 jaxbMarshaller.marshal(lists, result);

Se me presenta la siguiente excepción en tiempo de ejecución sin embargo:

javax.xml.se unen.JAXBException: com.jaxb.ejemplo.marshall.Libro, ni cualquier
de su super clase que se conoce a este contexto]

Mi se definen los tipos de la siguiente manera.

Libro :-

@XmlRootElement(name="book")
public class Book {

     private String title;
     private int year;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
}

Lista de libros :-

@XmlRootElement(name="lists")
public class BookLists {
List<Book> bookslst;

public List getBookslst() {
    return bookslst;
}

public void setBookslst(List bookslst) {
    this.bookslst = bookslst;
}

}

Marshall Código:-

Book book;
    BookLists lists=new BookLists();
    List lst=new ArrayList();
    book = new Book();
    book.setTitle("Book title");
    book.setYear(2010);
    lst.add(book);
    book = new Book();
    book.setTitle("Book title1");
    book.setYear(2011);
    lst.add(book);
    lists.setBookslst(lst);
    JAXBContext jaxbContext;
    try {
        jaxbContext = JAXBContext.newInstance(BookLists.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter result = new StringWriter();

        jaxbMarshaller.marshal(lists, result);
        String xml = result.toString();
        System.out.println(xml);
    } catch (JAXBException e) {
        //TODO Auto-generated catch block
        e.printStackTrace();
    }

Estoy tratando de poner @XMLSeeAlso anotaciones(Ref:- JAXB Excepción: la Clase no se conoce a este contexto). Esta anotación no está disponible en mi versión.

  • ¿Por qué molestarse en llamar a la propiedad bookslst cuando los libros o booksList va a hacer. Bookslst sólo se ve perezoso.
InformationsquelleAutor user1357722 | 2012-09-07

5 Comentarios

  1. 10

    Por defecto un JAXB (JSR-222) aplicación examina el descriptor de acceso público de los métodos. Se podría añadir el Book parámetro en la List en sus métodos get/set.

    public List<Book> getBookslst() {
        return bookslst;
    }
    
    public void setBookslst(List<Book> bookslst) {
        this.bookslst = bookslst;
    }

    Alternativamente, usted puede especificar el tipo de la propiedad mediante el @XmlElement anotación:

    @XmlElement(type=Book.class)
    public List getBookslst() {
        return bookslst;
    }

    También puede especificar que su JAXB implementación de hacer una introspección de los campos en lugar de las propiedades:

    @XmlRootElement(name="lists")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class BookLists {
        List<Book> bookslst;
    }

    ACTUALIZACIÓN

    Hay alguna forma alternativa de añadir a la Lista de la lista de libros en
    Marshallar.Marshall?

    Podría crear una Lista genérica objeto contenedor que aprovechó el @XmlAnyElement(lax=true) anotación (ver: http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html). A continuación, el frío manejar un List de nada anotado con @XmlRootElement.

    Listas

    package forum12323397;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.xml.bind.annotation.*;
    
    @XmlRootElement
    public class Lists<VALUE> {
    
        private List<VALUE> values = new ArrayList<VALUE>();
    
        @XmlAnyElement(lax=true)
        public List<VALUE> getValues() {
            return values;
        }
    
    }

    Demo

    package forum12323397;
    
    import javax.xml.bind.*;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Lists.class, Book.class);
    
            Lists<Book> lists = new Lists<Book>();
    
            Book book1 = new Book();
            book1.setTitle("A Book");
            book1.setYear(2001);
            lists.getValues().add(book1);
    
            Book book2 = new Book();
            book2.setTitle("Another Book");
            book2.setYear(2007);
            lists.getValues().add(book2);
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(lists, System.out);
        }
    
    }

    Salida

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <lists>
        <book>
            <title>A Book</title>
            <year>2001</year>
        </book>
        <book>
            <title>Another Book</title>
            <year>2007</year>
        </book>
    </lists>
    • Gracias.Ya he especificado la Lista de<Libro> bookslst en la lista de libros de frijol.Pero no me dieron tiempo de compilación excepción.Así que ¿por Qué poner un setBookslst(Lista de<Libro> bookslst) y la Lista de<Libro> getBookslst()?.
    • Porque por defecto de su JAXB impl se introspección al público los métodos get/set. Desde que tenía solo como List su JAXB (JSR-222) impl no sabía nada acerca de la Book clase. He actualizado mi respuesta con más información.
    • Sí.He visto la versión actualizada de respuesta.Hay alguna forma alternativa de añadir a la Lista de la lista de libros en Marshallar.Marshall?
    • He actualizado mi respuesta para incluir un enfoque diferente.
  2. 2

    Un Ejemplo de Trabajo que tengo:

    1) XML:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <bookstore>
        <bookList>
            <book>
                <author>Neil Strauss</author>
                <title>The Game</title>
                <publisher>Harpercollins</publisher>
                <isbn>978-0060554736</isbn>
            </book>
            <book>
                <author>Charlotte Roche</author>
                <title>Feuchtgebiete</title>
                <publisher>Dumont Buchverlag</publisher>
                <isbn>978-3832180577</isbn>
            </book>
        </bookList>
        <location>Frankfurt Airport</location>
        <name>Fraport Bookstore</name>
    </bookstore>

    2) clases de Java:

    Librería

    package jaxbtest;
    
    import java.util.ArrayList;
    
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlElementWrapper;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name="bookstore") //(namespace = "de.vogella.xml.jaxb.model", name="bookstore")
    public class Bookstore {
    
      //XmLElementWrapper generates a wrapper element around XML representation
      @XmlElementWrapper(name = "bookList")
      //XmlElement sets the name of the entities
      @XmlElement(name = "book")
      private ArrayList<Book> bookList;
      private String name;
      private String location;
    
      public void setBookList(ArrayList<Book> bookList) {
        this.bookList = bookList;
      }
    
      public ArrayList<Book> getBooksList() {
        return bookList;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public String getLocation() {
        return location;
      }
    
      public void setLocation(String location) {
        this.location = location;
      }
    } 

    3) Libro

    package jaxbtest;
    
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    
    @XmlRootElement(name = "book")
    //If you want you can define the order in which the fields are written
    //Optional
    @XmlType(propOrder = { "author", "name", "publisher", "isbn" })
    public class Book {
    
      private String name;
      private String author;
      private String publisher;
      private String isbn;
    
      //If you like the variable name, e.g. "name", you can easily change this
      //name for your XML-Output:
      @XmlElement(name = "title")
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public String getAuthor() {
        return author;
      }
    
      public void setAuthor(String author) {
        this.author = author;
      }
    
      public String getPublisher() {
        return publisher;
      }
    
      public void setPublisher(String publisher) {
        this.publisher = publisher;
      }
    
      public String getIsbn() {
        return isbn;
      }
    
      public void setIsbn(String isbn) {
        this.isbn = isbn;
      }
    
    } 

    4) Principales

    package jaxbtest;
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Arrays;
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.Unmarshaller;
    public class BookMain {
    private static final String BOOKSTORE_XML = "./bookstore-jaxb.xml";
    public static void main(String[] args) throws JAXBException, IOException {
    ArrayList<Book> bookList = new ArrayList<Book>();
    //create books
    Book book1 = new Book();
    book1.setIsbn("978-0060554736");
    book1.setName("The Game");
    book1.setAuthor("Neil Strauss");
    book1.setPublisher("Harpercollins");
    bookList.add(book1);
    Book book2 = new Book();
    book2.setIsbn("978-3832180577");
    book2.setName("Feuchtgebiete");
    book2.setAuthor("Charlotte Roche");
    book2.setPublisher("Dumont Buchverlag");
    bookList.add(book2);
    //create bookstore, assigning book
    Bookstore bookstore = new Bookstore();
    bookstore.setName("Fraport Bookstore");
    bookstore.setLocation("Frankfurt Airport");
    bookstore.setBookList(bookList);
    //create JAXB context and instantiate marshaller
    JAXBContext context = JAXBContext.newInstance(Bookstore.class);
    Marshaller m = context.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    //Write to System.out
    m.marshal(bookstore, System.out);
    //Write to File
    m.marshal(bookstore, new File(BOOKSTORE_XML));
    //get variables from our xml file, created before
    System.out.println();
    System.out.println("Output from our XML File: ");
    Unmarshaller um = context.createUnmarshaller();
    Bookstore bookstore2 = (Bookstore) um.unmarshal(new FileReader(BOOKSTORE_XML));
    ArrayList<Book> list = bookstore2.getBooksList();
    for (Book book : list) {
    System.out.println("Book: " + book.getName() + " from "
    + book.getAuthor());
    }
    /*
    String xmlStr = readFileToString(BOOKSTORE_XML);
    Bookstore bookstore = getPartial3(Bookstore.class ,xmlStr);
    for (Book b : bookstore.getBooksList())
    System.out.println(b.getName()+ " ---- " + b.getAuthor() );
    xmlStr = readFileToString("./listApplianceOfferings.xml");
    ApplianceList bookstore1 = getPartial3(ApplianceList.class ,xmlStr);
    for (Appliance b : bookstore1.getBooksList())
    System.out.println(b.getName() + " ---- " + b.getDescription() );
    */
    //88888
    //String xmlStr = readFileToString("./listStorageOfferings.xml");
    //   StorageOfferings storageOfferingsList = jaxbXmlString2Class(StorageOfferings.class ,xmlStr);
    StorageOfferings storageOfferingsList = jaxbXmlFile2Class(StorageOfferings.class ,"./listStorageOfferings.xml");
    for (StorageOffering s : storageOfferingsList.getStorageOfferingList() )
    System.out.println("8888--> "+ s.getName() + " ---- " + s.getId() );
    //99999
    }//main
    private static void getPartial() {
    //get variables from our xml file, created before
    System.out.println();
    System.out.println("Output from our XML File: ");
    Unmarshaller um;
    try {
    JAXBContext context = JAXBContext.newInstance(Bookstore.class);;
    um = context.createUnmarshaller();
    //     um.setEventHandler(new DefaultValidationEventHandler());
    FileReader fileReader = new FileReader(BOOKSTORE_XML);
    Bookstore bookstore = (Bookstore) um.unmarshal(fileReader );
    ArrayList<Book> list = bookstore.getBooksList();
    for (Book book : list) {
    System.out.println("Book: " + book.getName() + " from "
    + book.getAuthor());
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    private static void getPartial1() {
    //get variables from our xml file, created before
    System.out.println();
    System.out.println("Output from our XML File: ");
    Unmarshaller um;
    try {
    JAXBContext context = JAXBContext.newInstance(ApplianceList.class);;
    um = context.createUnmarshaller();
    //     um.setEventHandler(new DefaultValidationEventHandler());
    FileReader fileReader = new FileReader("./listApplianceOfferings.xml");
    ApplianceList alist = (ApplianceList) um.unmarshal(fileReader );
    ArrayList<Appliance> list = alist.getBooksList();
    for (Appliance book : list) {
    System.out.println("appliance: " + book.getName() + " from "
    + book.getDescription());
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    //-------------------
    private static <T> T getPartial2(Class<T> cls, String fname) {
    //get variables from our xml file, created before
    System.out.println();
    System.out.println("Output from our XML File: ");
    Unmarshaller um;
    T alist = null;
    try {
    JAXBContext context = JAXBContext.newInstance(cls);;
    um = context.createUnmarshaller();
    //     um.setEventHandler(new DefaultValidationEventHandler());
    FileReader fileReader = new FileReader(fname);
    alist = (T) um.unmarshal(fileReader );
    //ArrayList<?> list = alist.getBooksList();
    //   for (Appliance book : list) {
    //     System.out.println("appliance: " + book.getName() + " from "
    //         + book.getDescription());
    //   }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return alist;
    }
    //-------------------
    private static <T> T jaxbXmlFile2Class(Class<T> cls, String fileName) {
    FileReader fr = null;
    char [] cbuf = null;
    try {
    fr = new FileReader(fileName);
    cbuf = new char[3000];
    Arrays.fill(cbuf, ' ');
    fr.read(cbuf);
    }catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    finally{
    try { fr.close(); } 
    catch (IOException e) {
    e.printStackTrace();
    }
    }
    String s = new String(cbuf);
    return jaxbXmlString2Class(cls, s);
    }
    @SuppressWarnings("unchecked")
    private static <T> T jaxbXmlString2Class(Class<T> cls, String xmlStr) {
    //get variables from our xml file, created before
    System.out.println();
    System.out.println("Output from our XML File: ");
    Unmarshaller um;
    T alist = null;
    try {
    JAXBContext context = JAXBContext.newInstance(cls);;
    um = context.createUnmarshaller();
    System.out.println(xmlStr);
    InputStream is = new ByteArrayInputStream(xmlStr.getBytes());
    alist = (T) um.unmarshal( is );
    } catch (Exception e) {
    e.printStackTrace();
    }
    return alist;
    }
    } 
    • Ejemplo excelente, muchas gracias.
  3. 0

    Uso

    List<Book> lst=new ArrayList<Book>();

    Lugar de :

    List lst=new ArrayList();

    También Definir BoolList de la siguiente manera:

    @XmlRootElement(name="lists")
    public class BookLists {
    List<Book> bookslst;
    public List<Book> getBookslst() {
    return bookslst;
    }
    public void setBookslst(List<Book> bookslst) {
    this.bookslst = bookslst;
    }
    }
  4. 0

    Trate de añadir las dos clases de su JAXBContext.newInstance llamada.

    JAXBContext.newInstance(BookLists.class, Book.class);

    Usando tus clases este funciona:

    public static void main(String [] args) throws JAXBException {
    BookLists books = new BookLists();
    String [] titles = {"To Kill a Mockingbird", "Twelve Angry Men", "Are You My Mother", "Green Eggs And Ham"};
    List<Book> list = new ArrayList<Book>();
    for (String title : titles) {
    Book book = new Book();
    book.setTitle(title);
    list.add(book);
    }
    books.setBookslst(list);
    JAXBContext jc = JAXBContext.newInstance(BookLists.class, Book.class);
    Marshaller nm = jc.createMarshaller();
    nm.setProperty("jaxb.formatted.output", true);
    nm.marshal(books, System.out);
    }

    De salida:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <lists>
    <book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="book">
    <title>To Kill a Mockingbird</title>
    <year>0</year>
    </book>
    <book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="book">
    <title>Twelve Angry Men</title>
    <year>0</year>
    </book>
    <book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="book">
    <title>Are You My Mother</title>
    <year>0</year>
    </book>
    <book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="book">
    <title>Green Eggs And Ham</title>
    <year>0</year>
    </book>
    </lists>
    • Esto hará que el JAXBContext consciente de la Book clase, pero la JAXB impl no serán conscientes de que la bookslst propiedad es List<Book> es el mapa como List<Object>.
    • todavía funciona. La salida tiene los atributos xmlns y es feo. La adición de la <Libro> tipo por lo que los mapas es más bonito, aunque.

Dejar respuesta

Please enter your comment!
Please enter your name here