В настоящее время я пытаюсь размонтировать некоторый XML в объект java с использованием JAXB, и я получаю странное исключение Null Pointer. Это всего лишь проблема, в то время как неармаллирование. Я могу отлично обучать эти классы. Вот соответствующие фрагменты кода (несущественные части обозначаются «...»):Исключение Null Pointer при немаршаллировании XML с аннотацией @XmlAnyElement
JAXB Корневой элемент:
... @XmlRootElement(name="assets") public class Assets { String product; Images images = new Images(); ... Public Assets() {} ... public String getProduct() { return this.product; } @XmlAttribute(name="product") public void setProduct(String newProduct) { this.product = newProduct; } public Images getImages() { return this.images; } @XmlElement(name="images") public void setImages(Images newImages) { this.images = newImages; } ... }
Изображения подэлемент корневого элемента:
... @XmlRootElement(name="images") @XmlSeeAlso(Image.class) @XmlType(propOrder = {"mainAsset", "image"}) public class Images { List<Image> images; Image mainAsset; private static char counter = 'a'; private static final String prefix = "product-image-"; // Here's the part that causes the NPE @XmlAnyElement(lax=true) public List<JAXBElement<Image>> getImage() { final List<JAXBElement<Image>> imageList = new ArrayList<JAXBElement<Image>>(); for (final Image g : this.images) { imageList.add(new JAXBElement(new QName(prefix + counter++), Image.class, g)); } counter = 'a'; return imageList; } @XmlElement(name="renditions") public void setImage(List<Image> newImages) { this.images = newImages; } public Image getMainAsset() { return this.mainAsset; } @XmlElement(name="main-asset-name") public void setMainAsset(Image newMainAsset) { this.mainAsset = newMainAsset; } }
логика демаршаллизации в XML:
... public void modifyXML() { try { JAXBContext context = JAXBContext.newInstance(Assets.class, Images.class, Image.class); Unmarshaller um = context.createUnmarshaller(); File f = new File("/path/to/my.xml"); Assets assets = (Assets) um.unmarshal(f); ... } catch (JAXBException e) { e.printStackTrace(); } } ...
Наконец, XML я пытаюсь распаковать (это может помочь узнать, что этот файл XML был фактически создан с помощью маршаллер JAXB, который работает без каких-либо проблем):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assets product="TEST PRODUCT"> <images> <main-asset-name> <path>stuff.jpg</path> <title>theTitle</path> <alt>theAlt</path> <description>theDescription</description> </main-asset-name> <product-image-a> <path>48x48.jpg</path> <title>theTitle</path> <alt>theAlt</path> <description>theDescription</description> </product-image-a> <product-image-b> <path>140x140.jpg</path> <title>theTitle</path> <alt>theAlt</path> <description>theDescription</description> </product-image-b> <product-image-c> <path>1280x1280.jpg</path> <title>theTitle</path> <alt>theAlt</path> <description>theDescription</description> </product-image-c> <product-image-d> <path>319x319.jpg</path> <title>theTitle</path> <alt>theAlt</path> <description>theDescription</description> </product-image-d> </images> </assets>
Okay , так что это все соответствующий код (я думаю). Когда я запускаю свою программу, я получаю следующую ошибку сразу после вызова unmarshaller:
java.lang.NullPointerException
at com.my.companys.name.Images.getImage(Images.java:25)
И номер строки ссылки является строка, где цикл начинается в моем файле Images.java
класса.
У кого-нибудь есть идеи, почему this.images
может быть пустым здесь? Любая помощь приветствуется. Спасибо заранее.
Я верю, что проблема заключается в том, что в XML-элементе отсутствует элемент renditions и, следовательно, изображения равны нулю. – lsiva
Это хорошее предложение. Однако, даже если я удалю имя «выдачи» из аннотации '@ XmlElement', я все равно получаю ту же ошибку. – Pr4isethesun
Вам нужно сопоставить узел XML, чтобы объект был установлен. – lsiva