当通过 Maven WAR build/deploy 到 WildFly 时静态初始化块中的 NullPointerException

NullPointerException in static init block when WAR build/deploy to WildFly via Maven

我正在尝试通过 Maven 构建 WAR 并将其部署到 JBoss。当我通过 IntellJ build/deploy 一切正常时。

通过 Maven 部署我得到这个 Stacktrace:

018-02-20 16:59:09,863 ERROR [io.undertow.request] (default task-3) UT005023: Exception handling request to /akkredit-1/akkredit:  java.lang.ExceptionInInitializerError
at de.akkredit.Akkreditor.<init>(Akkreditor.java:109)
at de.akkredit.Akkreditor.getModules(Akkreditor.java:106)
at de.akkredit.Akkreditor.akkredit(Akkreditor.java:135)
at de.akkredit.service.Servlet.doPost(Servlet.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
....
Caused by: java.lang.NullPointerException
at de.akkredit.tools.Tools.<clinit>(Tools.java:41)
... 44 more

工具是一个 Class 具有静态函数和静态初始化块:

    try {
        String xslt = Tools.class.getClassLoader().getResource("/transform.xslt").getFile();
        xsltTransformer = tf.newTransformer( new StreamSource( new File( xslt ) ) );
        <line 41:> xsltTransformer.setOutputProperty( OutputKeys.INDENT, "yes" );
        xsltTransformer.setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", "2" );
        xsltTransformer.setOutputProperty( OutputKeys.ENCODING,"UTF-8" );
        xsltTransformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" );
    } catch (TransformerConfigurationException e1) { e1.printStackTrace(); }

见第 41 行

我确实认为发生这种情况是因为未找到资源 transform.xslt

文件位于src/main/resources

在WAR中:WEB-INF/classes/

如果有人能在这里给我提示,我将不胜感激。

此致

亚历克斯

    String xslt = Tools.class.getClassLoader().getResource("/transform.xslt").getFile();
    xsltTransformer = tf.newTransformer( new StreamSource( new File( xslt ) ) );

如果资源驻留在WAR-file中,返回的资源将类似于C:/some/dir/to/the/webapp/WebApp.war!/transform.xslt,无法用java.io.File打开。

改用 getResourceAsStream 并将返回的 InputStream 传递给您的 StreamSource。方法 returns null 如果找不到资源,那么可能会检查并记录它,而不是让整个事情再次崩溃 NullPointerException。如果发生这种情况,您可以尝试更改要查找的资源,例如到 transform.xslt(即没有前导斜杠)或真正确保资源实际上位于 war-file 它应该在的位置。

顺便说一句:你提到了 "line 41" 但我在你的代码中没有看到任何信息第 41 行实际上是什么,所以我假设

  1. 未部署,即驻留在测试系统的目录中,一切正常
  2. 第 41 行实际上是带有 new StreamSource( new File( xslt ) ) 的行,NullPointerException 来自那里。

顺便说一句:你说

The file is located in src/main/resources

in the WAR: WEB-INF/classes/

这是否意味着您的资源驻留在目录 src/main/resources 中,而该目录本身位于 war-file 中的 WEB-INF/classes 中?在这种情况下,您需要将要查找的资源更改为 /src/main/resources/transform.xslt。如果您的意思是它在您进行测试时驻留在前一个目录中,而当部署为 WAR 时它驻留在后一个目录中,没关系 ;-)