JSP - TransformerFactory.newInstance (). NewTransformer (xsl) возвращает ноль? - PullRequest
2 голосов
/ 04 ноября 2010

API Java гарантирует, что он никогда не вернет ноль - но для меня это так!

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 были созданы с использованием new, они должны содержать не NULL, поэтому это должен быть преобразователь, который становится NULL. Почему это происходит и как я могу это исправить?

Бросает это:

org.apache.jasper.JasperException: исключение в 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)

РЕДАКТИРОВАТЬ: Это определенно случай, когда трансформатор как-то ноль. Смотреть:

org.apache.jasper.JasperException: исключение в 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.

РЕДАКТИРОВАТЬ2: Если я изменяю newTransformer (xsl) на newTransformer (), он работает, поэтому проблема в newTransformer (xsl).

Ответы [ 4 ]

4 голосов
/ 20 июня 2012

Я столкнулся с той же проблемой, когда некоторые из моих тестов пошли не так, после добавления новой зависимости в проект.Хотите знать, как это может вернуть null , когда его API говорит, что это невозможно, я пересмотрел его снова:

"Получите новый экземпляр TransformerFactory. Этот статический метод создаетновый экземпляр фабрики Этот метод использует следующую упорядоченную процедуру поиска для определения класса реализации TransformerFactory для загрузки: используйте системное свойство javax.xml.transform.TransformerFactory. ... [порядок поиска] ... Как только приложение получит ссылку наTransformerFactory, он может использовать фабрику для настройки и получения экземпляров трансформатора. "

Итак, я взглянул на TransformerFactory API , и там написано:

"Системное свойство, определяющее, какую реализацию Фабрики создать, называется« javax.xml.transform.TransformerFactory ». Это свойство именует конкретный подкласс абстрактного класса TransformerFactory. Если свойствоне определено, используется платформа по умолчанию. "

AsЯ упомянул, что проблема началась, когда я добавил новую зависимость в проект: еще один проект, который обрабатывает 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

и все работало нормально.

2 голосов
/ 12 марта 2012

Ответ на этот вопрос указывает на то, что это произойдет, когда XSL недействителен, что объясняет, с чем я сейчас сталкиваюсь.

В нашем конкретном случае XMLредактор, который использовался, молча вставлял невидимый символ в первую позицию файла.Печать первых нескольких байтов файла показала это.Используя более мощный редактор, мы удалили поврежденные байты из файла, и все было хорошо.

0 голосов
/ 04 ноября 2010

Проверьте, является ли xml пустым / пустым, прежде чем передать его. Я думаю, вы найдете, что он пуст.

например. new StreamSource(new URL(mondialURL).openStream()) возвращает ноль или пустой объект?

0 голосов
/ 04 ноября 2010

Входной поток пуст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...