Incapaz de entender el comportamiento poco riguroso de JAXB

Referencia a mi post anterior . Tengo el siguiente código que está leyendo XML del archivo.

logger.log(Level.INFO, "testSchemaChange"); JAXBContext jaxbContext = JAXBContext.newInstance("com.store.web.ws.v1.model"); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); JAXBElement jeBookType = (JAXBElement) unmarshaller.unmarshal(new File (BOOK_XML)); BookType bookType = jeBookType.getValue(); logger.log(Level.INFO, "Book recieved: " + bookType.getISBN()); 

Estoy sembrando un XML con Book como mi elemento raíz en lugar de BookList . Este ejemplo funciona bien siempre que guarde la ruta completa del paquete en JAXBContext.newInstance .

Tan pronto me cambié

JAXBContext jaxbContext = JAXBContext.newInstance("com.store.web.ws.v1.model");

a

JAXBContext jaxbContext = JAXBContext.newInstance(BookType.class);

Comencé a recibir la excepción SEVERE: unexpected element (uri:"", local:"book"). Expected elements are (none) SEVERE: unexpected element (uri:"", local:"book"). Expected elements are (none)

¿Alguien puede explicar por qué es este comportamiento?

PD: Por motivos de conveniencia, mi clase de prueba y las clases generadas por JAXB están en el mismo paquete, es decir, com.store.web.ws.v1.model

El problema que está viendo es porque JAXBContext no tiene conocimiento de su clase ObjectFactory que contiene la anotación @XmlElementDecl para el elemento del book .

Cuando creas un JAXBContext en un nombre de paquete, el tirará automáticamente en la clase ObjectFactory . Si crea un JAXContext en clases, debe incluir explícitamente la clase con la anotación ObjectFactory ( ObjectFactory en este caso).