我正在尝试通过maven为JBoss构建和部署WAR。当我通过IntellJ构建/部署时,一切正常。
通过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$3.<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
Tools是一个带有静态函数和静态初始化块的类:
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 /
如果有人能在这里给我一个提示,会很感激。
问候
亚历
答案 0 :(得分:1)
String xslt = Tools.class.getClassLoader().getResource("/transform.xslt").getFile();
xsltTransformer = tf.newTransformer( new StreamSource( new File( xslt ) ) );
如果资源位于WAR文件中,则返回的资源将类似于C:/some/dir/to/the/webapp/WebApp.war!/transform.xslt
,而java.io.File
无法打开。
使用getResourceAsStream
代替并将返回的InputStream
传递给您的StreamSource
。如果找不到资源,该方法将返回null
,因此可能会检查并记录该资源,而不是让整个事件再次使用NullPointerException
崩溃。如果发生这种情况,您可以尝试更改要查找的资源,例如:到transform.xslt
(即没有前导斜杠)或者确实确保资源实际上在战争文件中它应该是。
new StreamSource( new File( xslt ) )
的行,而NullPointerException
来自那里。该文件位于src / main / resources
中 WAR中的:WEB-INF / classes /
这是否意味着您的资源位于战争文件中src/main/resources
所在的目录WEB-INF/classes
中?在这种情况下,您需要更改资源以查找/src/main/resources/transform.xslt
。如果您在进行测试时意味着它位于前一个目录中,并且在部署为WAR时它位于后者中,请不要介意; - )