Hi!
I'm trying to map an enumeration with MOXy using a transformation mapping but I can't get it to work. Here's what I got:
Java:
public enum Detail { GENERAL, DETAILED }
public class MyClass {
Detail detail;
/* getters & setters */
}
XML:
<app:MyClass detail="GENERAL" xmlns:app="http://example.com"/>
Configuration:
private XMLDescriptor createDescriptor() {
XMLDescriptor descriptor = super.buildDescriptor(MyClass.class);
descriptor.setDefaultRootElement("app:MyClass");
descriptor.add(createDetailMapping());
return descriptor;
}
private XMLTransformationMapping createDetailMapping() {
XMLTransformationMapping mapping = new XMLTransformationMapping();
mapping.setAttributeName("detail");
EnumTransformer transformer = new EnumTransformer();
mapping.setAttributeTransformer(transformer);
mapping.addFieldTransformer("@detail", transformer);
return mapping;
}
Transformer:
public class EnumTransformer implements AttributeTransformer, FieldTransformer {
private AbstractTransformationMapping mapping;
private XMLField detailField;
public void initialize(AbstractTransformationMapping mapping) {
this.mapping = mapping;
NamespaceResolver namespaceResolver = ((XMLDescriptor)mapping.getDescriptor()).getNamespaceResolver();
detailField = new XMLField("@detail");
detailField.setNamespaceResolver(namespaceResolver);
}
public Object buildAttributeValue(Record record, Object object, Session session) {
String detail = (String) record.get(detailField);
return Detail.valueOf(detail);
}
public Object buildFieldValue(Object instance, String fieldName, Session session) {
return mapping.getAttributeValueFromObject(instance);
}
}
When I try to run it I get this stack trace:
java.lang.NullPointerException
at org.eclipse.persistence.oxm.record.UnmarshalRecord.startElement(UnmarshalRecord.java:551)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshallerHandler.startElement(SAXUnmarshallerHandler.java:273)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3095)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:921)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at org.eclipse.persistence.internal.oxm.record.XMLReader.parse(XMLReader.java:99)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:215)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:192)
at org.eclipse.persistence.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:274)
...
Anyone knows what's going on?
Thanks!