2014-12-05 103 views
0

我正在Spring MVC框架上構建一個Web應用程序,並使用thymeleaf作爲我的模板引擎。Spring MVC + Thymeleaf java.io.IOException:文件名,目錄名稱或卷標語法不正確

在添加新的REST控制器之前,我有一個工作應用程序。一個IOException現在拋出

產生java.io.IOException:文件名,目錄名或卷標語法不正確

java.io.IOException: The filename, directory name or volume label syntax is incorrect 
at java.io.WinNTFileSystem.canonicalize0(Native Method) 
at java.io.Win32FileSystem.canonicalize(Win32FileSystem.java:414) 
at java.io.File.getCanonicalPath(File.java:618) 
at org.eclipse.jetty.util.resource.FileResource.getAlias(FileResource.java:195) 
at org.eclipse.jetty.server.handler.ContextHandler.checkAlias(ContextHandler.java:1599) 
at org.eclipse.jetty.server.handler.ContextHandler.getResource(ContextHandler.java:1583) 
at org.eclipse.jetty.webapp.WebAppContext.getResource(WebAppContext.java:360) 
at org.mortbay.jetty.plugin.JettyWebAppContext.getResource(JettyWebAppContext.java:338) 
at org.eclipse.jetty.webapp.WebAppContext$Context.getResource(WebAppContext.java:1325) 
at org.springframework.web.context.support.ServletContextResource.getURL(ServletContextResource.java:153) 
at org.springframework.web.servlet.resource.PathResourceResolver.isResourceUnderLocation(PathResourceResolver.java:177) 
at org.springframework.web.servlet.resource.PathResourceResolver.checkResource(PathResourceResolver.java:148) 
at org.springframework.web.servlet.resource.PathResourceResolver.getResource(PathResourceResolver.java:121) 
at org.springframework.web.servlet.resource.PathResourceResolver.getResource(PathResourceResolver.java:92) 
at org.springframework.web.servlet.resource.PathResourceResolver.resolveResourceInternal(PathResourceResolver.java:76) 
at org.springframework.web.servlet.resource.AbstractResourceResolver.resolveResource(AbstractResourceResolver.java:46) 
at org.springframework.web.servlet.resource.DefaultResourceResolverChain.resolveResource(DefaultResourceResolverChain.java:57) 
at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.getResource(ResourceHttpRequestHandler.java:271) 
at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:208) 
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:735) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) 
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684) 
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) 
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557) 
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) 
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086) 
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429) 
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) 
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) 
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255) 
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154) 
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) 
at org.eclipse.jetty.server.Server.handle(Server.java:370) 
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494) 
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971) 
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033) 
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644) 
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) 
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) 
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53) 
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) 
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) 
at java.lang.Thread.run(Thread.java:745) 

當瀏覽器嘗試獲取的CSS這只是發生,JS或來自我的taoConnection-servlet.xml的任何其他靜態資源。我的jetty和tomcat7部署都發生同樣的情況。經過幾個小時的搜索後,我找不到任何類似的問題。

編輯:我正在調用/帳戶請求映射,但它發生在所有訪問靜態資源的請求映射。如果我嘗試直接在瀏覽器中訪問資源,例如http://localhost:8080/css/bootstrap.min.csshttp://localhost:8080/js/sb-admin-2.js引發異常。

或者,如果我嘗試訪問假資源,例如http://localhost:8080/js/fake.js我仍然得到一個標準的http 404,這是預期的,但不拋出IOException。

項目結構

-src 
-main 
    -java 
    -*controller 
    -MainController.java 
    -RestAccountController.java 
    -resources 
    -META-INF 
    -spring 
    -applicationContext.xml 
    -webapp 
    -css 
    -font-awesome-4.1.0 
    -js 
    -less 
    -pages 
    -WEB-INF 
    -taoConnection-servlet.xml 
    -web.xml 

taoConnection-servlet.xml中

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

    <import resource="classpath*:META-INF/spring/applicationContext*.xml" /> 
    <context:component-scan base-package="com.quadrimular.nts.results.connection.*" /> 
    <context:component-scan base-package="com.quadrimular.nts.results.connection" /> 
    <mvc:annotation-driven/> 
    <mvc:resources mapping="/css/**" location="/css/**" /> 
    <mvc:resources mapping="/js/**" location="/js/**" /> 
    <mvc:resources mapping="/font-awesome-4.1.0/**" location="/font-awesome-4.1.0/**" /> 
    <mvc:resources mapping="/pages/**" location="/pages/**" /> 

    <bean id="templateResolver" 
     class="org.thymeleaf.templateresolver.ServletContextTemplateResolver"> 
     <property name="prefix" value="/pages/" /> 
     <property name="suffix" value=".html" /> 
     <property name="templateMode" value="HTML5" /> 
     <property name="cacheable" value="false" /> 
    </bean> 
    <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine"> 
     <property name="templateResolver" ref="templateResolver" /> 
    </bean> 
    <bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver"> 
     <property name="templateEngine" ref="templateEngine" /> 
     <property name="order" value="1" /> 
    </bean> 

    <!-- Configure to plugin JSON as request and response in method handler --> 
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
     <property name="messageConverters"> 
      <list> 
       <ref bean="jsonMessageConverter"/> 
      </list> 
     </property> 
    </bean> 

    <!-- Configure bean to convert JSON to POJO and vice versa --> 
    <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean> 
</beans> 

MainController.java

package com.quadrimular.nts.results.connection.controller; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.ModelMap; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

import com.quadrimular.fyfe.fulfillment.service.AccountService; 

@Controller 
public class MainController { 
    @Autowired 
    private AccountService accountService; 

    @RequestMapping(value = "/account", method = RequestMethod.GET) 
    public String getAllaccounts(ModelMap model){ 
     try{ 
      model.addAttribute("accountList", accountService.getAllAccounts()); 
     }catch(Exception e){ 
      model.addAttribute("error", true); 
      model.addAttribute("errMsg", e.getMessage()); 
     } 

     return "account"; 
    } 

    @RequestMapping(value = "/main", method = RequestMethod.GET) 
    public String main(ModelMap model){ 
     return "main"; 
    } 

    @RequestMapping(value = "/account", method = RequestMethod.PUT) 
    public String addAccount(ModelMap model){ 
     return "account"; 
    } 
} 

RestAccountController.java

package com.quadrimular.nts.results.connection.controller; 

import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.http.HttpStatus; 
import org.springframework.web.bind.annotation.ExceptionHandler; 
import org.springframework.web.bind.annotation.RequestBody; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseStatus; 
import org.springframework.web.bind.annotation.RestController; 

import com.quadrimular.fyfe.fulfillment.Account; 
import com.quadrimular.fyfe.fulfillment.service.AccountService; 

@RestController 
@RequestMapping(value = "/api") 
public class RestAccountController { 

    AccountService accountService; 

    @Autowired 
    public RestAccountController(AccountService accountService){ 
     this.accountService = accountService; 
    } 

    @RequestMapping(value="/account", method= RequestMethod.GET, headers = "Accept=application/json") 
    public List<Account> getAllAccounts(){ 
     List<Account> accounts = accountService.getAllAccounts(); 
     return accounts; 
    } 

    @RequestMapping(value="/account", method=RequestMethod.POST, headers = "Accept=application/json") 
    public Account addAccount(@RequestBody Account act) throws Exception{ 
      return accountService.addAccount(act); 
    } 

    @ExceptionHandler(Exception.class) 
    @ResponseStatus(value = HttpStatus.BAD_REQUEST) 
    public String handleException(Exception e) { 
     return "Error: " + e.getMessage(); 
    } 
} 

的web.xml

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    version="3.0" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <servlet> 
     <servlet-name>taoConnection</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>taoConnection</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 
+0

你需要上傳你的項目結構,也許還有requestmapping您呼叫 – Jaiwo99 2014-12-05 22:54:03

+0

我已經用所要求的信息和一些額外的說明更新了這個問題。我真的失去了導致這種發展的原因。我記不清配置的變化。欣賞你的時間。 – 2014-12-05 23:26:07

+0

也請將web.xml – Jaiwo99 2014-12-05 23:39:47

回答

0

試試這個:

<mvc:resources mapping="/css/**" location="/css/" /> 
<mvc:resources mapping="/js/**" location="/js/" /> 
<mvc:resources mapping="/font-awesome-4.1.0/**" location="/font-awesome-4.1.0/" /> 
<mvc:resources mapping="/pages/**" location="/pages/" /> 
+0

完美的作品!我想知道你能否向我解釋爲什麼一個非常類似的項目(實際上是這個項目的起點)具有位置=「/ css/**」,並且按預期工作,完全訪問所有靜態資源? 感謝您的解決方案,我只是不明白爲什麼排序問題或什麼問題是擺在首位。 – 2014-12-06 00:17:15

+0

@RobertField將'**'加回去,並且在啓用DEBUG的情況下重啓你的服務器,spring會告訴你這個問題 – Jaiwo99 2014-12-06 00:23:32

相關問題