簡體   English   中英

使用jaxb從一個xml文檔生成兩個對象

[英]Generate two objects from one xml document with jaxb

我正在創建一個rest api,它將使用一個xml文檔並從該文檔創建兩個對象。 然后,將使用休眠將對象保留在數據庫中。 這就是我現在所擁有的:

@PUT
@Path("saveVehicle")
@Consumes("application/xml;charset=utf-8")
@Produces("text/plain")
public String saveVehicleData(String xml) {
    DBClient client = new DBClient();
    Session session = client.getVehicleSession();
    JAXBContext jaxbContext;

    try {
        Reader reader = new StringReader(xml);
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLStreamReader xmlReader = factory.createXMLStreamReader(reader);

        jaxbContext = JAXBContext.newInstance(VehicleData.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        VehicleData vehicle = (VehicleData) jaxbUnmarshaller.unmarshal(xmlReader);

        session.saveOrUpdate(vehicle);
        session.flush();

        jaxbContext = JAXBContext.newInstance(VehicleOwner.class);
        jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        VehicleOwner owner = (VehicleOwner) jaxbUnmarshaller.unmarshal(xmlReader);

        session.saveOrUpdate(owner);
        session.flush();

        return vehicle.getRegistrationNo() + " " + owner.getName();
    } catch (JAXBException e) {
        e.printStackTrace();
        return "JAXBException " + e.getMessage() + "\nCaused by " + e.getCause();
    } catch (XMLStreamException e) {
        e.printStackTrace();
        return "XMLStreamException " + e.getMessage();
    }
}

如您所見,該方法應該以xml作為字符串。 然后,它將根據該文檔生成車輛和車輛所有者。 該文檔包含有關車輛及其所有者的信息,但我希望它們在單獨的數據庫表中。 這些類對我要存儲在數據庫中的所有字段使用jaxb批注。 但是,當我嘗試運行此代碼時,得到以下堆棧跟蹤:

java.lang.ClassCastException: org.package.VehicleOwner cannot be cast to org.package.VehicleData
org.package.rest.LoginController.saveVehicleData(LoginController.java:369)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542)
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409)
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:558)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:733)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

在為車主添加映射之前,我可以實例化VehicleData並將其存儲在數據庫中。 但是現在看來,希望此xml文檔被映射到VehicleOwner 我認為可以將文檔映射到不同的類。 不是嗎? 如果是,我該怎么辦?

可以將文檔映射到不同的類,但是顯然您不這樣做。 只是做:

    jaxbContext = JAXBContext.newInstance(VehicleData.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    VehicleData vehicle = (VehicleData) jaxbUnmarshaller.unmarshal(xmlReader);

不會神奇地將XML結構映射到VehicleData結構。 您必須定義或生成映射,以便同一XML在不同的JAXB上下文中可以映射到不同的結構( VehicleData / VehicleOwner )。 您還必須確保這些上下文不相交(我想它們對您而言)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM