JAXB Marshaller : StringWriter output has a truncated tag value

后端 未结 1 795
抹茶落季
抹茶落季 2021-01-21 04:10

I want to marshall a java object to xml string. Therefore I have been given a schema from which I generate the JAXB classes. There is a set method(corresponding to an element of

相关标签:
1条回答
  • 2021-01-21 04:16

    NEW ANSWER

    In your sample code val is the hexBinary representation of str.getBytes(). But the value you are setting on the arr property is the bytes from the hex encoded String.

    String str = new String("hi");
    String val = Hex.encodeHexString(str.getBytes());
    root.setString(str);
    root.setArr(val.getBytes());
    

    I believe what you mean to do is the following:

    String str = new String("hi");
    String val = Hex.encodeHexString(str.getBytes());
    root.setString(str);
    root.setArr(str.getBytes());
    

    Which will produce the following output

    val=6869
    getString =hi
    getArr=hi
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <root xsi:schemaLocation="http://www.example.com/schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <string>hi</string>
        <a>6869</a>
    </root>
    

    Put another way

        String str = new String("hi");
        System.out.print("String:  " + str);
        System.out.println(" hexBinary:  " + Hex.encodeHexString(str.getBytes()));
        String val = Hex.encodeHexString(str.getBytes());
        System.out.print("String:  " + val);
        System.out.println(" hexBinary:  " + Hex.encodeHexString(val.getBytes()));
    

    Will output:

    String:  hi hexBinary:  6869
    String:  6869 hexBinary:  36383639
    

    ORIGINAL ANSWER

    I have not been able to reproduce the issue that you are seeing. I am using a String size of 500000. Below is what I have tried (does this sample work for you?). Is it possible that the truncation is due to the console you are writing the long String to?

    Demo

    package forum12146217;
    
    import java.io.*;
    import javax.xml.bind.*;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Root.class);
    
            // Build a long String
            StringBuilder stringBuilder = new StringBuilder();
            for(int x=0; x<500000; x++) {
                stringBuilder.append("a");
            }
            Root root = new Root();
            root.setString(stringBuilder.toString());
            System.out.println(root.getString().length());
    
            // Marshal the object to a StringWriter
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.example.com/schema.xsd");
            StringWriter stringWriter = new StringWriter();
            marshaller.marshal(root, stringWriter);
    
            // Convert StringWriter to String
            String xml = stringWriter.toString();
            //System.out.println(xml);
    
            // Unmarshal the XML and check length of long String
            Unmarshaller unmarshaller = jc.createUnmarshaller();
            Root unmarshalledRoot = (Root) unmarshaller.unmarshal(new StringReader(xml));
            System.out.println(unmarshalledRoot.getString().length());
        }
    
    }
    

    Root

    package forum12146217;
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement
    public class Root {
    
        private String string;
    
        public String getString() {
            return string;
        }
    
        public void setString(String string) {
            this.string = string;
        }
    
    }
    

    Output

    500000
    500000
    
    0 讨论(0)
提交回复
热议问题