我正在使用MOXy和相同的域对象模型来生成xml / json。进行编组和解编组以生成json输出的效果与预期的一样,在进行编组后,我可以获取具有所有值的java对象,但是对xml进行编组不会给出具有所有期望值的java对象,而是给出空值。虽然编组工作正常。下面是代码

域对象模型

@XmlType(propOrder = {"colour","model","transmission"})
public class BMW {

private String colour;
private String model;
private String transmission;

@XmlPath("Cars/BMW/colour/text()")
public void setColour(String colour){
    this.colour = colour;
}
@XmlPath("Cars/BMW/model/text()")
public void setModel(String model){
    this.model = model;
}
@XmlPath("Cars/BMW/transmission/text()")
public void setTransmission(String transmission){
    this.transmission = transmission;
}

public String getColour(){
    return this.colour;
}
public String getModel(){
    return this.model;
}
public String getTransmission(){
    return this.transmission;
}


}

编组和拆组的测试方法

    BMW bmw = new BMW();
    bmw.setColour("white");
    bmw.setModel("X6");
    bmw.setTransmission("AUTO");
    File fileXML = new File("/..../bmw.xml");
    File fileJson = new File("/..../bmw.json");
    XMLInputFactory xif = XMLInputFactory.newInstance();
    JAXBContext jaxbContext;
    try {
        jaxbContext = JAXBContext.newInstance(BMW.class);
        Marshaller m = jaxbContext.createMarshaller();
        Unmarshaller um = jaxbContext.createUnmarshaller();
//=====         XML
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        m.marshal(bmw, fileXML);
        m.marshal(bmw, System.out);
        StreamSource xml = new StreamSource(fileXML);
        XMLStreamReader xsr = xif.createXMLStreamReader(xml);
//          xsr.nextTag();
//          xsr.nextTag();
        BMW bmwXML = (BMW)um.unmarshal(xsr,BMW.class).getValue();

//====          JSON
        m.setProperty("eclipselink.json.include-root", false);
        m.setProperty("eclipselink.media-type", "application/json");
        um.setProperty("eclipselink.media-type", "application/json");
        um.setProperty("eclipselink.json.include-root", false);
        m.marshal(bmw, fileJson);
        m.marshal(bmw, System.out);
        StreamSource json = new StreamSource(fileJson)
        BMW bmwJson = um.unmarshal(json, BMW.class).getValue();
    } catch (JAXBException e) {
        e.printStackTrace();
    } catch (XMLStreamException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


从上面的代码中可以看到,我尝试使用xsr.NextTag(),但没有帮助。

因此,bmwXML具有所有空值,而bmwJson可以正常工作。不知道我在做什么错。

最佳答案

编组为XML时,没有为BMW类提供根元素信息。这意味着您需要执行以下操作之一:


BMW注释@XmlRootElement

@XmlRootElement
@XmlType(propOrder = {"colour","model","transmission"})
public class BMW {

在封送之前,将您的BMW实例包装在JAXBElement中。请注意,在进行解组时,将BMW的实例包装在JAXBElement中,这就是您所谓的getValue()

JAXBElement<BMW> je = new JAXBElement(new QName("root-element-name"), BMW.class, bmw);
m.marshal(je, fileXML);

08-08 00:54