当前位置: 首页 > 知识库问答 >
问题:

解析Xml DocumentBuilder

萧星火
2023-03-14

我正在尝试用DocumentBuilder将xml结果转换为字符串。我构建了以下函数,以便从数据库中获取所有结果,当我将它们存储在列表中并发送到列表时一切都很好,但当我试图将结果显示为字符串xml时,下一个错误就出现了。

WS00041: Service invocation threw an exception with message : null; Refer to the server log for more details
Exceptions details : java.lang.reflect.InvocationTargetException
javax.servlet.ServletException: java.lang.reflect.InvocationTargetException
    at org.glassfish.webservices.monitoring.WebServiceTesterServlet.doPost(WebServiceTesterServlet.java:342)
    at org.glassfish.webservices.monitoring.WebServiceTesterServlet.invoke(WebServiceTesterServlet.java:106)
    at org.glassfish.webservices.JAXWSServlet.doPost(JAXWSServlet.java:157)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
    at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.glassfish.webservices.monitoring.WebServiceTesterServlet.doPost(WebServiceTesterServlet.java:313) ... 32 more
    Caused by: com.sun.xml.ws.fault.ServerSOAPFaultException: Client received SOAP Fault from server: java.lang.IllegalArgumentException: Can not set java.util.List field NewWebServiceMaterias.jaxws.GetMateriaResponse._return to java.lang.String Please see the server log to find more detail regarding exact cause of the failure.
    at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:193)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:131)
    at com.sun.xml.ws.client.sei.StubHandler.readResponse(StubHandler.java:253)
    at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:203)
    at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:290)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:92)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:161)
    at com.sun.proxy.$Proxy283.getMateria(Unknown Source) ... 37 more
    @WebMethod(operationName = "getMateria")
    public String getMateria() {
        Conexion c = new Conexion();
        Connection cn = c.Conectar();
        List<Materia> materia;
        String mensaje;
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder;
        try {
            docBuilder = docFactory.newDocumentBuilder();
            Document doc = docBuilder.newDocument();
            Element rootElement = doc.createElement("materia");
            doc.appendChild(rootElement);
            try {
                Statement st = cn.createStatement();
                ResultSet rs = st.executeQuery("select * from asignaturas");
                materia = new ArrayList<>();
                while (rs.next()) {
                    materia.add(new Materia(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4)));
                    Element nombreMateria = doc.createElement("nombre");
                    nombreMateria.appendChild(doc.createTextNode(rs.getString(3)));
                    Element detMateria = doc.createElement("detalle");
                    detMateria.appendChild(doc.createTextNode(rs.getString(4)));
                    rootElement.appendChild(nombreMateria);
                    rootElement.appendChild(detMateria);
                }
                TransformerFactory tf = TransformerFactory.newInstance();
                Transformer transformer = tf.newTransformer();
                //transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
                StringWriter writer = new StringWriter();
                transformer.transform(new DOMSource(doc), new StreamResult(writer));
                String output = writer.getBuffer().toString().replaceAll("\n|\r", "");
                return output;

            } catch (SQLException | DOMException | TransformerException e) {
                mensaje = "este es un error" + e.getMessage();
            }
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(NewWebServiceMaterias.class.getName()).log(Level.SEVERE, null, ex);
            mensaje = "ESTAMOS EN EL ERROR 1" + ex.getMessage();
        }

        return mensaje + "El valor no se ha encontrado";
    }

共有1个答案

南宫胡媚
2023-03-14

其中一个可能的原因是:您从右到左的顺序检索列值,并且多次检索:

while (rs.next()) {
    materia.add(new Materia(rs.getInt(1), 
        rs.getString(2), rs.getString(3), rs.getString(4)));
    // skipped
    nombreMateria.appendChild(doc.createTextNode(rs.getString(3)));
    detMateria.appendChild(doc.createTextNode(rs.getString(4)));
    // skipped
}

这可能导致预期的(在Materia构造函数中或调用ApendChild(...)时)与得到的(调用GetString(...)可能返回Null)不匹配。

如文档中所述:

默认的resultset对象不可更新,其光标只能向前移动。因此,您只能对它进行一次迭代,并且只能从第一行到最后一行。

为了实现最大的可移植性,应按从左到右的顺序读取每行内的结果集列,并且每列只应读取一次。

 类似资料:
  • plugins/kibana/public/dashboard/index.js 结构跟 visualize 类似,设置两个调用 savedDashboards.get() 方法的 routes,提供一个叫 dashboard-app 的 directive。 savedDashboards 由 plugins/kibana/public/dashboard/services/saved_dash

  • index.js 中,首要当然是注册自己。此外,还加载两部分功能:plugins/kibana/visualize/editor/* 和 plugins/kibana/visualize/wizard/wizard.js。然后定义了一个 route,默认跳转 /visualize 到 /visualize/step/1。 editor editor.js 中也定义了两个 route,分别是 /vi

  • 前文已经说到,kibana.js 中依次加载了各主要功能模块的入口。比如搜索页是 src/core_plugins/kibana/public/discover/index.js。通过这个文件路径就可以猜到,有关搜索页的功能,代码应该都在 src/core_plugins/kibana/public/discover/ 里了。这个目录下的文件有: _hit_sort_fn.js component

  • 词法解析、语法解析 这一节我们分析下PHP的解析阶段,即 PHP代码->抽象语法树(AST) 的过程。 PHP使用re2c、bison完成这个阶段的工作: re2c: 词法分析器,将输入分割为一个个有意义的词块,称为token bison: 语法分析器,确定词法分析器分割出的token是如何彼此关联的 例如: $a = 2 + 3; 词法分析器将上面的语句分解为这些token:$a、=、2、+、3

  • 问题内容: 我正在创建一个复杂的JavaScript库,用于与公司的服务器端框架一起使用。 服务器端框架将其数据编码为简单的XML格式。没有花哨的命名空间或类似的东西。 理想情况下,我想将浏览器中的所有数据解析为JSON。但是,如果这样做,我需要重写一些服务器端代码以吐出JSON。这很痛苦,因为我们拥有无法轻易更改的公共API。 我真正关心的是浏览器中解析JSON和XML的性能。真的有很大的区别要

  • 问题内容: 我有如下所示的HTML内容。我在这里寻找的标签是和。Java是否提供任何HTML解析技术? 问题答案: String value = Jsoup.parse(new File(“d:\1.html”), “UTF-8”).select(“img”).attr(“src”); System.out.println(value); //http://socialimg04.rediff.c

  • 问题内容: 我有这个日期,似乎无法正确解析。 字符串文本“ 2014年5月21日星期三05:44:09 -0700”; 这是我的日期格式 我正在尝试使用SimpleDateFormat对其进行解析。 错误字符串无法分析。 我在这里做错了。 请注意,这不是重复项。另一个问题中没有描述使用强制语言环境的解决方案。 问题答案: 要解析您的日期,您可以使用 但是如果失败了,您会看到 java.text.P

  • 问题内容: 我在我的应用程序中收到一些json数据: 哪个日志: 这正是我想要的。 但是,当我去阅读电子邮件的价值时, 我收到无效的参数异常: 由于未捕获的异常’NSInvalidArgumentException’而终止应用程序,原因:’ * -[NSDictionary initWithDictionary:copyItems:]:字典参数不是NSDictionary’ 如何读取此值? 问题答