2015-01-11 4 views
2

Я получаю java.lang.NullPointerException: при попытке вызвать метод java.lang.String.trim() объекта, возвращенного с org.w3c.dom.Node.getTextContent().Omnifaces 1.8.1 Исключение разбора WebXML

Когда я использую

List<String> welcomeFiles = WebXml.INSTANCE.getWelcomeFiles(); 

из ManagedBean, как показано ниже:

@ManagedBean 
@RequestScoped 
public class LogoffControl implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    /** 
    * log4j logger 
    */ 
    protected static final Logger LOGGER = LogFactory 
      .getLogger(LogoffControl.class); 

    public String logoff() { 
     List<String> welcomeFiles = WebXml.INSTANCE.getWelcomeFiles(); 
     try { 
      Faces.redirect(welcomeFiles.get(0)); 
     } catch (IOException e) { 
      LOGGER.error("Redirect Failed: " + e.getMessage()); 
     } 
     Faces.invalidateSession(); 
     return ""; 
    } 
} 

я получаю NullPointerException, говоря, что я, возможно, опечатка в моем web.xml. Я отлажена, и я вижу, что результат выполнения XPATH в WebXML.java строке 414 успешно, и я делаю его в петлю на линии 418

welcomeFiles.add(welcomeFileList.item(i).getTextContent().trim()); 

В отладчике welcomeFileList.item(i) оценивающего к <welcome-file>index.jsp</welcome-file>, однако вызывающий welcomeFileList.item(i).getTextContent() результат в null. Я не могу понять это ... Что мне не хватает?

В журнале:

Jan 11, 2015 1:36:37 PM org.omnifaces.config.WebXml init 
SEVERE: WebXml failed to initialize. Perhaps your web.xml contains a typo? 
java.lang.NullPointerException: while trying to invoke the method java.lang.String.trim() of an object returned from org.w3c.dom.Node.getTextContent() 
at org.omnifaces.config.WebXml.parseWelcomeFiles(WebXml.java:418 

Oracle JSF 2.1.26, Omnifaces 1.8.1, сервлет 2.5, sapjvm6.1 (Java6), на сервере 7.4 SAPNetweaver.

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5"> 
    <display-name>tablemaint-web</display-name> 

    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

    .... 
</webapp> 
+0

Неловкий. Я проверяю ошибку в использовании парсера JAXP. Какой парсер JAXP используется в среде? Можете ли вы попробовать локально с помощью 'getFirstChild(). GetNodeValue()' вместо 'getTextContent()'? – BalusC

+0

Я могу подтвердить, что getFirstChild(). GetNodeValue() действительно работает. Поставщик JAXP находится из SAP com.sap.engine.lib.jaxp.SAXParserFactoryImpl – Chris

+0

Теперь я замечаю, что класс WebXML инициализируется автоматически с помощью omnifaces faces-config.xml (я думаю, через конфигурацию OmniPartialViewContext), поэтому я получаю это исключение NullPointerException даже без моего специального кода выше. Как и следовало ожидать, на этой платформе другие методы getTextContent() выдают ту же ошибку. У меня мало надежды, что SAP исправит эту ошибку, есть ли шанс обходного решения? – Chris

ответ

2

Это ошибка в используемом парсере JAXP. Это должно работать нормально. Парсер SAP JAXP, по-видимому, каким-то образом не распознает текстовый узел как текстовый узел. getTextContent() будет возвращать null напр. узел документа и узел типа документа.

Обходной использования getFirstChild().getNodeValue() вместо getTextContent(), кажется, работает нормально (и должны продолжать нормально работать на приличных JAXP парсеров), так что это было implemented и исправление доступно в сегодняшних 1.11 snapshot2.1 snapshot для 2.x пользователей).