2013-05-29 2 views
2

Я положил wro.xml в src/main/resources, так как есть другие ресурсы, и их легче получить к ним в модульных тестах.Wro4j Custom XML Model Location

Мне нужно расширить некоторые классы wro, чтобы читать модель с другого места, но не может заставить ее работать.

Необходимый код

web.xml:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:applicationContext.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<filter> 
    <filter-name>WebResourceOptimizer</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    <init-param> 
     <param-name>targetBeanName</param-name> 
     <param-value>wroFilter</param-value> 
    </init-param> 
    <init-param> 
     <param-name>targetFilterLifecycle</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>WebResourceOptimizer</filter-name> 
    <url-pattern>/resources/*</url-pattern> 
</filter-mapping> 

applicationContext.xml:

<bean id="wroFilter" class="ro.isdc.wro.http.ConfigurableWroFilter"> 
    <property name="properties" ref="wroProperties" /> 
</bean> 

<bean id="wroProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="location" value="classpath:wro.properties" /> 
</bean> 

wro.properties:

managerFactoryClassName=com.example.web.wro.manager.factory.MyWroManagerFactory; 
preProcessors=cssUrlRewriting,cssImport,semicolonAppender,lessCss 
postProcessors=cssMin,jsMin 
debug=true 

MyWroManagerFactory:

public class MyWroManagerFactory extends CopyrightKeeperConfigurableWroManagerFactory { 
    private static final Logger LOG = LoggerFactory.getLogger(MyWroManagerFactory.class); 

    @Override 
    protected WroModelFactory newModelFactory() { 
     LOG.debug("Load wro.xml directly from classpath"); 
     return new XmlModelFactory() { 
      @Override 
      protected InputStream getModelResourceAsStream() throws IOException { 
       final String resourceLocation = getDefaultModelFilename(); 
       final InputStream stream = getClass().getResourceAsStream(resourceLocation); 

       if (stream == null) { 
        throw new IOException("Invalid resource requested: " + resourceLocation); 
       } 

       return stream; 
      } 
     }; 
    } 
} 

CopyrightKeeperConfigurableWroManagerFactory:

public class CopyrightKeeperConfigurableWroManagerFactory extends ConfigurableWroManagerFactory { 
    private static final Logger LOG = LoggerFactory.getLogger(CopyrightKeeperConfigurableWroManagerFactory.class); 

    private static final String[] PROCESSORS = { 
     CssImportPreProcessor.ALIAS, 
     JawrCssMinifierProcessor.ALIAS, 
     CssMinProcessor.ALIAS, 
     JSMinProcessor.ALIAS 
    }; 

    @Override 
    protected void contributePreProcessors(final Map<String, ResourcePreProcessor> map) { 
     for (String processor : PROCESSORS) { 
      if (map.containsKey(processor)) { 
       LOG.debug("Apply CopyrightKeeperProcessorDecorator on " + processor); 
       map.put(processor, CopyrightKeeperProcessorDecorator.decorate(map.get(processor))); 
      } 
     } 
    } 
} 

Почему он не может найти classes/wro.xml/Как использовать пользовательское место для wro.xml?

EDIT Вот полный выход журнала: http://pastebin.com/NeNy1NH4

ответ

1

Проблема заключается в том, что вы загружаете модель относительно MyWroManagerFactory класса:

final InputStream stream = getClass().getResourceAsStream(resourceLocation); 

Это означает, что он будет искать модели в папке, где находится класс. Поскольку ваш wro.xml находится в папке классов (который является корнем для пути к классам), следует использовать следующие:

ClassLoader.getSystemResourceAsStream(resourceLocation); 

В качестве альтернативы можно использовать ClasspathUriLocator:

new ClasspathUriLocator().locate("classpath:" + resourceLocation) 

EDITED: По-видимому, в этом примере была обнаружена проблема, описанная ниже: issue: . Пока исправление не будет готово, доступны следующие варианты:

+0

Это не решена она :-(См EDIT раздел выше. – dtrunk

+0

Это потому, что getDefaultModelFilename(); возвращает /WEB-INF/wro.xml, а у вас есть папка wro.xml в классах. Либо создайте папку WEB-INF в вашем пути к классам, либо не используйте метод getDefaultModelFilename(). –

+0

Нет, getDefaultModelFilename() возвращает wro.xml: https://github.com/alexo/wro4j/blob/1.6.x/wro4j-core/src/main/java/ro/isdc/wro/model/factory/XmlModelFactory .java # L394 – dtrunk