有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JSP TransformerFactory。newInstance()。新变压器(xsl)返回空值?

JavaAPI保证它永远不会返回空值——但对我来说,它是

http://download.oracle.com/javase/6/docs/api/javax/xml/transform/TransformerFactory.html#newTransformer(javax.xml.transform.Source

相关代码:

xml = new StreamSource(new URL(mondialURL).openStream());
xsl = new StreamSource(new File("/REMOVED/countriesnofilter.xsl"));
result = new StreamResult(new PrintWriter(out));

transformer = TransformerFactory.newInstance().newTransformer(xsl);
transformer.transform(xml, result);

由于xml、xsl和result是使用新的东西生成的,所以它们必须包含NOTNULL,所以变为null的必须是transformer。为什么会发生这种情况?我如何修复它

抛出这个:

组织。阿帕奇。贾斯珀。jaspereException:JSP中的异常:/dca/ass2/a.JSP:46

43:  result = new StreamResult(new PrintWriter(out));
44:  
45:  transformer = TransformerFactory.newInstance().newTransformer(xsl);
46:  transformer.transform(xml, result);
47: 
48: %>
49:  <INPUT TYPE="SUBMIT" VALUE="Get one country">


Stacktrace:
 org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:451)
 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
 sun.reflect.GeneratedMethodAccessor50.invoke(Unknown Source)
 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 java.lang.reflect.Method.invoke(Method.java:597)
 org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
 java.security.AccessController.doPrivileged(Native Method)
 javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
 org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
 org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)
root cause

java.lang.NullPointerException
 org.apache.jsp.dca.ass2.a_jsp._jspService(a_jsp.java:104)
 org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
 sun.reflect.GeneratedMethodAccessor50.invoke(Unknown Source)
 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 java.lang.reflect.Method.invoke(Method.java:597)
 org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
 java.security.AccessController.doPrivileged(Native Method)
 javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
 org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
 org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)

编辑:在某种程度上,变压器肯定是空的。观察:

组织。阿帕奇。贾斯珀。jaspereException:JSP中的异常:/dca/ass2/a.JSP:49

46:     
47:     xml.getInputStream();
48:     xsl.getInputStream();
49:     transformer.reset();
50:     
51:     //transformer.transform(xml, result);
52: 

这又是一个空指针异常。如果是因为xml为空,那么它将抛出一个NPE值47

EDIT2:如果我将newTransformer(xsl)更改为newTransformer(),它会工作,因此这是newTransformer(xsl)中的一个问题


共 (4) 个答案

  1. # 1 楼答案

    在传递xml之前,请检查它是否为null/空。我想你会发现它是空的

    例如,new StreamSource(new URL(mondialURL).openStream())是返回null还是空对象

  2. # 2 楼答案

    输入流为空

  3. # 3 楼答案

    在向项目添加了新的依赖项之后,当我的一些测试出错时,我遇到了同样的问题。我想知道当API说这是不可能的时候,这个返回怎么可能null,我再次修改了它:

    "Obtain a new instance of a TransformerFactory. This static method creates a new factory instance This method uses the following ordered lookup procedure to determine the TransformerFactory implementation class to load: Use the javax.xml.transform.TransformerFactory system property. ... [lookup order] ... Once an application has obtained a reference to a TransformerFactory it can use the factory to configure and obtain transformer instances."

    所以,我也看了一下TransformerFactoryAPI,它说:

    "The system property that determines which Factory implementation to create is named "javax.xml.transform.TransformerFactory". This property names a concrete subclass of the TransformerFactory abstract class. If the property is not defined, a platform default is be used."

    正如我提到的,当我向项目添加一个新的依赖项时,问题就开始了:另一个处理XML文档/签名的项目。我删除了依赖项,运行了测试(添加依赖项失败),并检索了TransformerFactory的特定类。我重新添加了依赖项并再次运行了测试:它现在是一个不同的类。因此,正如我所想,查找过程实例化了一个错误的TransformerFactory实现,在添加的jar中找到了它

    我不想通过添加另一个系统属性来修复它,因此我更改了如下代码:

    private static final String TRANSFORMER_FACTORY_CLASS = "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl";
    
    TransformerFactory factory = TransformerFactory.newInstance(TRANSFORMER_FACTORY_CLASS, null);
    //null for default ClassLoader
    

    一切都很顺利

  4. # 4 楼答案

    This question的答案似乎表明当XSL无效时会发生这种情况,这可以解释我目前遇到的问题

    在我们的特定示例中,使用的XML编辑器在文件的第一个位置悄悄插入了一个不可见的字符。打印文件的前几个字节显示了这一点。使用更强大的编辑器,我们从文件中删除了有问题的字节,一切都很好