spring boot/loaded 테스트하다가 다음과 같은 java.io.FileNotFoundException : FreeMarkerConfigurer 발생했다. 실행이 되길래, ERROR인 줄 알았는데,  DEBUG 이다. 

절대 경로에서 해당 파일이 없어서 Exception이 발생했고, 대비책(fallback)으로 spring classpath에서 파일을 읽은 것이다. 

따라서 절대로 에러가 아니다!!

사실 Exception 을 wrap 해서 간단히 보여줘도 될 것을.. exception을 다 stack으로 출력했나 싶긴하다..



2015-05-18 18:01:23.618 DEBUG 52607 --- [           main] o.s.w.s.v.f.FreeMarkerConfigurer         : Cannot resolve template loader path [classpath:/templates/] to [java.io.File]: using SpringTemplateLoader as fallback


java.io.FileNotFoundException: class path resource [templates/] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/mydev/location-lab/target/google-location-lab-0.0.1-SNAPSHOT.jar!/templates/

at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:212)

at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52)

at org.springframework.ui.freemarker.FreeMarkerConfigurationFactory.getTemplateLoaderForPath(FreeMarkerConfigurationFactory.java:342)

at org.springframework.ui.freemarker.FreeMarkerConfigurationFactory.createConfiguration(FreeMarkerConfigurationFactory.java:290)

at org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer.afterPropertiesSet(FreeMarkerConfigurer.java:116)



소스를 보면, debug일 때에만 발생하도록 되어 있다. 

/**
* Determine a FreeMarker TemplateLoader for the given path.
* <p>Default implementation creates either a FileTemplateLoader or
* a SpringTemplateLoader.
* @param templateLoaderPath the path to load templates from
* @return an appropriate TemplateLoader
* @see freemarker.cache.FileTemplateLoader
* @see SpringTemplateLoader
*/
protected TemplateLoader getTemplateLoaderForPath(String templateLoaderPath) {
   if (isPreferFileSystemAccess()) {
      // Try to load via the file system, fall back to SpringTemplateLoader
      // (for hot detection of template changes, if possible).
      try {
         Resource path = getResourceLoader().getResource(templateLoaderPath);
         File file = path.getFile()// will fail if not resolvable in the file system
         if (logger.isDebugEnabled()) {
            logger.debug(
                  "Template loader path [" + path + "] resolved to file path [" + file.getAbsolutePath() + "]");
         }
         return new FileTemplateLoader(file);
      }
      catch (IOException ex) {
         if (logger.isDebugEnabled()) {
            logger.debug("Cannot resolve template loader path [" + templateLoaderPath +
                  "] to [java.io.File]: using SpringTemplateLoader as fallback", ex);
         }
         return new SpringTemplateLoader(getResourceLoader(), templateLoaderPath);
      }
   }
   else {
      // Always load via SpringTemplateLoader (without hot detection of template changes).
      logger.debug("File system access not preferred: using SpringTemplateLoader");
      return new SpringTemplateLoader(getResourceLoader(), templateLoaderPath);
   } }

logback.xml 파일에서 로그 레벨을 info로 수정하면 더이상의 Exception은 당연히 발생하지 않는다. 
<logger name="org.springframework.web" level="INFO"/>




Posted by '김용환'
,