Java JSP-TransformerFactory.newInstance().newTransformer(xsl)是否返回null?

Java JSP-TransformerFactory.newInstance().newTransformer(xsl)是否返回null?,java,xml,jsp,xslt,Java,Xml,Jsp,Xslt,JavaAPI保证它永远不会返回空值——但对我来说,它是 ) 相关代码: xml = new StreamSource(new URL(mondialURL).openStream()); xsl = new StreamSource(new File("/REMOVED/countriesnofilter.xsl")); result = new StreamResult(new PrintWriter(out)); transformer = TransformerFactory.newI

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

)

相关代码:

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。为什么会发生这种情况?我如何修复它

抛出这个:


org.apache.jasper.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)
这又是一个空指针异常。如果是因为xml为空,那么它将抛出一个NPE值47


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

输入流是空的。

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

e、 g.
newstreamsource(newurl(mondialURL).openStream())
返回null或空对象吗?

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


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

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

“获取TransformerFactory的新实例。此静态方法创建一个新工厂实例。此方法使用以下命令: 确定TransformerFactory实现的查找过程 要加载的类:使用javax.xml.transform.TransformerFactory系统 属性…[查找顺序]…一旦应用程序获得 引用TransformerFactory,它可以使用工厂进行配置 并获取变压器实例。”

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

确定要创建哪个工厂实现的系统属性名为“javax.xml.transform.TransformerFactory” 属性命名TransformerFactory抽象的一个具体子类 如果未定义属性,则平台默认值为 用过。”

正如我提到的,当我向项目添加一个新的依赖项时,问题就开始了:另一个处理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

而且一切正常。

为什么你确定npe是由这个
46:transformer.transform(xml,result)引起的行?stacktrace中的行号是否与您提供的列表中的行号匹配?org.apache.jasper.jaspereException:Exception in JSP:/dca/ass2/a.JSP:46。46:transformer.transform(xml,result);。因此,NPE是由该行引起的。我有相同的问题:。您找到解决方案了吗?我可以确认情况并非如此:org.apache.jasper.jaspereException:Exception in JSP:/dca/ass2/a.JSP:49 46:47:xml.getInputStream();48:xsl.getInputStream();49:transformer.reset();50:51://transformer.transform(xml,结果);52:所以它抛出了一个异常,因为transformer为null。您的解决方案帮助我解决了一个问题,
TransformerFactory.newInstance().newTransformer()
导致了一个
ClassNotFoundException
。我仍然需要理解为什么,因为这一行代码在过去是一种魅力。@MaxArt我很高兴它是有用的。由于同一个解决方案对您有效,很可能您的项目中添加了某些依赖项(也使用TransformerFactory的库,但实现不同),或者您刚刚将现有库更新为较新版本。是的,确实,我猜是这样的,但是。。。不幸的是,我完全不知道会发生什么。在最新版本的Java中,
newInstance
方法似乎不再接受参数。你必须依靠报告的程序。我发现最简单的方法是使用
System.setProperty(“javax.xml.transform.TransformerFactory”,TRANSFORMER\u FACTORY\u CLASS)
。没错,我没有用最新版本的Java检查它。虽然查看了您评论中的链接,但我可以看到有两个
newInstance
方法(与以前的Java版本一样):一个没有参数,另一个与我的答案中的参数相同:)对我来说,这是在svn更新之后,我没有看到xsl中存在冲突,使xsl使用无效的xml
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