【问题标题】:Xml to Java Class using JAXBContext使用 JAXBContext 将 XML 转换为 Java 类
【发布时间】:2019-01-11 12:55:23
【问题描述】:

我创建了几个 REST Web 服务,它们将从我的数据库中返回记录列表。

我以 XML 格式返回所有查询结果,并在我的 Web 服务方法中将其转换为 Java,以 JSON 格式将其发送到我的客户端应用程序(我知道,这不是最好的情况)。

我正在尝试减少我的方法中的代码,我开始使用的部分代码是 XML 到 Java 的转换。

现在我正在使用以下

String xml = xml.replaceFirst("ROWSET xmlns:xsi = " + "\"http://www.w3.org/2001/XMLSchema-instance\"", "invTrxXmlList");  
String string = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";  
xml = string.concat(xml);  
xml = xml.replaceAll("ROWSET", "invTrxXmlList");  
xml = xml.replaceAll("ROW", "invTrxXmlList");  
xml = xml.replaceAll(" xsi:nil = \"true\"", "");  
InputStream instr = new ByteArrayInputStream(xml.getBytes());  
JAXBContext jaxbContext = JAXBContext.newInstance(InvTrxXmlList.class);  
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();  
InvTrxXmlList invTrxXml = (InvTrxXmlList) jaxbUnmarshaller.unmarshal(instr);  

inventoryTrx = new InventoryTrx(invTrxXml);  

我想要的是创建一个单独的方法,该方法可以被该作业的所有方法调用,如果可能的话,可以使用几个不同的自定义对象,例如 InvTrxXmlList。

我在另一项任务中使用了反射,我正在考虑使用它来解决这个问题。

你能帮帮我吗?

还有其他方法吗?

谢谢

【问题讨论】:

  • 您必须创建一个 http post 方法,并在其正文中传递列表。我不知道你是怎么弄得这么复杂的
  • 感谢您的回复。我只使用 XML,因为我还没有使用 JSON 的数据库版本并且我无法更新它,并且我不想更改我的所有服务和客户端应用程序以使用 XML。我想要的是减少重复的代码量,并且这个块被重复了几次,因为我的 pkg 列表函数将始终返回 XML。现在,如果有一种方法可以(动态地)实例化一个对象,我有几个不同的对象,从调用者发送名称甚至实例化对象,然后用我的 XML 中的数据填充它,这会很棒。跨度>
  • 创建一个java类 1.@Path("/product")

标签: java xml rest web-services reflection


【解决方案1】:

谢谢西弗莱德,

我可以用下面的代码让它工作

public Object xmlToJava(Object pCurrentObject, String pXml, String pRowset, String pRow) {
    InputStream  instr = null;
    JAXBContext  jaxbContext = null;
    Unmarshaller jaxbUnmarshaller = null;

    String xmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
    String xmlReturn = null;
    Class  objectClass = pCurrentObject.getClass();
    try {
        xmlReturn =
            pXml.replaceFirst("ROWSET xmlns:xsi = " +
                              "\"http://www.w3.org/2001/XMLSchema-instance\"",
                              pRowset); //"invTrxLines");

        xmlReturn = xmlHeader.concat(xmlReturn);
        xmlReturn = xmlReturn.replaceAll("ROWSET", pRowset); //"invTrxLines");

        if (null != pRow && !pRow.isEmpty()) {
            xmlReturn = xmlReturn.replaceAll("ROW", pRow); //invTrxLine);
        } else { //Remove Row tags in case of single object
            xmlReturn = xmlReturn.replaceAll("<ROW>", "");
            xmlReturn = xmlReturn.replaceAll("</ROW>", "");
        }

        xmlReturn = xmlReturn.replaceAll(" xsi:nil = \"true\"", "");
        instr = new ByteArrayInputStream(xmlReturn.getBytes());
        jaxbContext = JAXBContext.newInstance(objectClass); //InvTrxHead.class);
        jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        pCurrentObject = jaxbUnmarshaller.unmarshal(instr);
    } catch (Exception e) {
        // TODO: Add catch code
        e.printStackTrace();
    }
    return pCurrentObject;
}

通过以下调用

invTrxHead = (InvTrxHead) WSUtils.xmlToJava(invTrxHead, invTrxHeadXml, "invTrxHead", null);

现在我可以从我的数据库和我的对象的一个​​实例中发送我的 XML,而不必复制任何代码。

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2010-10-27
    • 2014-01-05
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多