当Java无法读取Windows上的lastModifiedTime属性时,这意味着什么?

k10s72fa  于 2022-12-05  发布在  Windows
关注(0)|答案(1)|浏览(234)

一个客户在我的应用程序的日志中出现了大量的堆栈跟踪。它运行在Windows Server上的WildFly 18和JDK 11上。

2022-10-14 14:36:19,382 ERROR [io.undertow.request] (default I/O-2) UT005071: Undertow request failed HttpServerExchange{ GET /application/images/gray/qtip/nul}: java.lang.RuntimeException: java.nio.file.FileSystemException: C:\PROGRAM\SAUSAGE\wildfly-gui\standalone\tmp\vfs\temp\temp5bd4c0db725d6b53\content-d8575e88ce594507\images\gray\qtip\nul: The parameter is incorrect.

    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.resource.PathResource.getLastModified(PathResource.java:65)
    at org.wildfly.extension.undertow@18.0.1.Final//org.wildfly.extension.undertow.deployment.ServletResource.getLastModified(ServletResource.java:61)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.resource.CachedResource.<init>(CachedResource.java:59)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.resource.CachingResourceManager.getResource(CachingResourceManager.java:119)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.resource.CachingResourceManager.getResource(CachingResourceManager.java:32)
    at io.undertow.servlet@2.0.27.Final//io.undertow.servlet.handlers.ServletPathMatches.getServletHandlerByPath(ServletPathMatches.java:96)
    at io.undertow.servlet@2.0.27.Final//io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:146)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.HttpContinueReadHandler.handleRequest(HttpContinueReadHandler.java:65)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.PathHandler.handleRequest(PathHandler.java:91)
    at org.wildfly.extension.undertow@18.0.1.Final//org.wildfly.extension.undertow.Host$OptionsHandler.handleRequest(Host.java:399)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.HttpContinueReadHandler.handleRequest(HttpContinueReadHandler.java:65)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.SetHeaderHandler.handleRequest(SetHeaderHandler.java:90)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.encoding.EncodingHandler.handleRequest(EncodingHandler.java:72)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.SetHeaderHandler.handleRequest(SetHeaderHandler.java:90)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.SetHeaderHandler.handleRequest(SetHeaderHandler.java:90)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.SetHeaderHandler.handleRequest(SetHeaderHandler.java:90)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.SetHeaderHandler.handleRequest(SetHeaderHandler.java:90)
    at org.wildfly.extension.undertow@18.0.1.Final//org.wildfly.extension.undertow.Host$AcmeResourceHandler.handleRequest(Host.java:421)
    at org.wildfly.extension.undertow@18.0.1.Final//org.wildfly.extension.undertow.Host$HostRootHandler.handleRequest(Host.java:430)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.NameVirtualHostHandler.handleRequest(NameVirtualHostHandler.java:64)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.error.SimpleErrorPageHandler.handleRequest(SimpleErrorPageHandler.java:78)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.CanonicalPathHandler.handleRequest(CanonicalPathHandler.java:49)
    at org.wildfly.extension.undertow@18.0.1.Final//org.wildfly.extension.undertow.Server$DefaultHostHandler.handleRequest(Server.java:190)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.ChannelUpgradeHandler.handleRequest(ChannelUpgradeHandler.java:211)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.DisallowedMethodsHandler.handleRequest(DisallowedMethodsHandler.java:61)
    at io.undertow.core@2.0.27.Final//io.undertow.server.Connectors.executeRootHandler(Connectors.java:376)
    at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.http.HttpReadListener.handleEventWithNoRunningRequest(HttpReadListener.java:255)
    at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:136)
    at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:59)
    at org.jboss.xnio@3.7.3.Final//org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
    at org.jboss.xnio@3.7.3.Final//org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66)
    at io.undertow.core@2.0.27.Final//io.undertow.protocols.ssl.SslConduit$SslReadReadyHandler.readReady(SslConduit.java:1176)
    at org.jboss.xnio.nio@3.7.3.Final//org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:89)
    at org.jboss.xnio.nio@3.7.3.Final//org.xnio.nio.WorkerThread.run(WorkerThread.java:591)
Caused by: java.nio.file.FileSystemException: C:\PROGRAM\SAUSAGE\wildfly-gui\standalone\tmp\vfs\temp\temp5bd4c0db725d6b53\content-d8575e88ce594507\images\gray\qtip\nul: The parameter is incorrect.

    at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:92)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
    at java.base/sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(WindowsFileAttributeViews.java:53)
    at java.base/sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(WindowsFileAttributeViews.java:38)
    at java.base/sun.nio.fs.WindowsFileSystemProvider.readAttributes(WindowsFileSystemProvider.java:198)
    at java.base/java.nio.file.Files.readAttributes(Files.java:1764)
    at java.base/java.nio.file.Files.getLastModifiedTime(Files.java:2315)
    at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.resource.PathResource.getLastModified(PathResource.java:63)
    ... 36 more

所以总是getLastModifiedTime方法触发这个问题。这是否意味着存在权限问题?我猜我的Java程序没有足够的权限访问这些文件,但我不确定这一点。
有人能帮帮我吗?

qlckcl4x

qlckcl4x1#

如果我们看一下底层异常:

java.nio.file.FileSystemException: C:\PROGRAM\SAUSAGE\wildfly-gui\standalone\tmp\vfs\temp\temp5bd4c0db725d6b53\content-d8575e88ce594507\images\gray\qtip\nul: The parameter is incorrect.

我们可以看到文件的最终路径组件是nul。这个名称在Windows中是完全不允许的,这就是为什么会出现神秘的异常消息(它可能来自Windows,而不是Java)。这在https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file 中有记录:
请勿使用以下保留名称作为文件名:
CON、PRN、AUX、NUL、COM 0、COM 1、COM 2、COM 3、COM 4、COM 5、COM 6、COM 7、COM 8、COM 9、LPT 0、LPT 1、LPT 2、LPT 3、LPT 4、LPT 5、LPT 6、LPT 7、LPT 8和LPT 9。还应避免这些名称后面紧跟扩展名;例如,不建议使用NUL.txt。
解决方案:不要将文件命名为nul

相关问题