when does JAXB unmarshaller.unmarshal returns a JAXBElement or a MySchemaObject?

后端 未结 5 1088
日久生厌
日久生厌 2020-12-29 20:41

I have two codes, in two different java projects, doing almost the same thing, (unmarshalling the input of a webservice according to an xsd-file).

But in one case I

5条回答
  •  猫巷女王i
    2020-12-29 21:29

    Thanks to all your explanations and links, I've have written this so as to take care of both cases, using Annotation Introspection.

    This has the advantage of:

    • not modifying generated java classes
    • allowing all possible xsd format

    It works for output as well as input, and is according to me more generic:

    public class JaxbWrapper {
    
        private static boolean isXmlRootElement(Class classT){
            
            Annotation[] annotations = classT.getAnnotations();
            
            for(Annotation annotation : annotations){
                if(annotation instanceof XmlRootElement){
                    return true;
                }
            }       
            
            return false;
        }
        
        public static Object unmarshall(Class classObjectFactory, Class classObject, XMLStreamReader xmlStreamReader){
            
            Package pack = classObjectFactory.getPackage();
            String strPackageName = pack.getName();
            
            Object returnObject = null;
            
            try {
                JAXBContext jc = JAXBContext.newInstance(strPackageName, classObjectFactory.getClassLoader());
                
                Unmarshaller unmarshaller = jc.createUnmarshaller();
                
                returnObject = unmarshaller.unmarshal( xmlStreamReader );
                
                boolean bIsRootedElement = isXmlRootElement(classObject);
                if(!bIsRootedElement)
                {
                    JAXBElement jaxbElement = (JAXBElement) returnObject;
                    returnObject = jaxbElement.getValue();              
                }
            }
            catch (JAXBException e) {
                /*...*/
            }   
    
            return returnObject;
        }
        
        private static void writeToXml(Class classObjectFactory, Object obj, XMLStreamWriter xmlStreamWriter){
            
            Package pack = classObjectFactory.getPackage();
            String strPackageName = pack.getName();
            
            try {       
                JAXBContext jc = JAXBContext.newInstance(strPackageName, classObjectFactory.getClassLoader());
                Marshaller marshaller = jc.createMarshaller();
                marshaller.marshal(obj, xmlStreamWriter);
            }
            catch(JAXBException e) {
                /*...*/
            }       
        }
        
        public static String marshall(Class classObjectFactory, Class classObject, Object obj){
            
            Object objectToMarshall = obj; 
            
            boolean bIsRootedElement = isXmlRootElement(classObject);
            if(!bIsRootedElement)
            {
                Package pack = classObjectFactory.getPackage();
                String strPackageName = pack.getName();
                
                String strClassName = classObject.getName();
                
                QName qName = new QName(strPackageName, strClassName);
                
                JAXBElement jaxbElement = new JAXBElement(qName, classObject, null, obj);
                
                objectToMarshall = jaxbElement; 
            }
            
            StringWriter sw = new StringWriter();
            XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
            XMLStreamWriter xmlStreamWriter = null;
            
            try {
                xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(sw);
                
                writeToXml(classObjectFactory, objectToMarshall, xmlStreamWriter);
    
                xmlStreamWriter.flush();
                xmlStreamWriter.close();
            } 
            catch (XMLStreamException e) {
                /*...*/
            }
    
            return sw.toString();
        }
    }
    

提交回复
热议问题