1

在 wro4j 文档的帮助下,我成功实现了自定义后处理器过滤器。

它的工作是生成 SASS 变量并将其添加到一组 SASS 文件中,然后将这些文件传递给 ruby​​SassCss 过滤器进行编译,并且它做得很好。

问题是我想将确定 SASS 变量的工作交给ThemeManager @ServiceSpring 管理的自定义项。我没有考虑过过滤器将无法看到自动连接的@Service,但情况似乎如此。

当我@Autowire进入@Service控制器时,它工作正常,但是当我尝试使用过滤器做同样的事情时,我在尝试使用它时得到一个 NPE。

有没有办法让@Service过滤器可见,还是我以错误的方式接近这个?

谢谢你的帮助。

更新:

从很多角度进行了一些操作和攻击,但我似乎成功地将我的 themeManagerService 自动装配到我的 WRO filterRegistrationBean bean 的应用程序配置中。然后我将 themeManagerService bean 作为第二个参数传递给我的自定义 ConfigurableWroManagerFactory。

存在于自定义 WroManagerFactory 中的是对自定义 UriLocator 的引用,该 UriLocator 将该 themeManagerService 作为参数。自定义 UriLocator 由包含组内任意关键字的 CSS 资源调用。

新的 UriLocator 能够从 themeManagerService 提供的内容生成 ByteArrayInputStream 并将其传递到管道中。

简单的。

当这种方法成功/失败时,我会跟进。

4

1 回答 1

1

最后,我能够将 Spring 管理的 ThemeManagerService 直接提供给自定义后处理器,而不是依赖于自定义 UriLocator。我很早就尝试过,但是忘记在新的构造函数中调用 super(),所以处理器注册系统被破坏了。

我在注册 WRO bean 时将其 传递@Autowired ThemeManagerService给我:CustomConfigurableWroManagerFactory

@Autowired
ThemeManagerService themeManagerService;

@Bean
FilterRegistrationBean webResourceOptimizer(Environment env) {
    FilterRegistrationBean fr = new FilterRegistrationBean();
    ConfigurableWroFilter filter = new ConfigurableWroFilter();
    Properties props = buildWroProperties(env);
    filter.setProperties(props);
    //The overridden constructor passes ThemeManager along
    filter.setWroManagerFactory(new CustomConfigurableWroManagerFactory(props,themeManagerService));
    filter.setProperties(props);
    fr.setFilter(filter);
    fr.addUrlPatterns("/wro/*");
    return fr;
}

into的构造函数注入ThemeManagerService意味着CustomConfigurableWroManagerFactory它可以传递给自定义后处理器,因为它由以下方式注册contributePostProcessors

public class CustomConfigurableWroManagerFactory extends Wro4jCustomXmlModelManagerFactory {
    private ThemeManagerService themeManagerService;

    public CustomConfigurableWroManagerFactory(Properties props,ThemeManagerService themeManagerService) {
        //forgetting to call super derailed me early on
        super(props);
        this.themeManagerService = themeManagerService;
    }

    @Override
    protected void contributePostProcessors(Map<String, ResourcePostProcessor> map) {
        //ThemeManagerService is provided as the custom processor is registered
        map.put("repoPostProcessor", new RepoPostProcessor(themeManagerService));
    }
}

现在,后处理器可以访问ThemeManagerService

@SupportedResourceType(ResourceType.CSS)
public class RepoPostProcessor implements ResourcePostProcessor {
    private ThemeManagerService themeManagerService;

    public RepoPostProcessor(ThemeManagerService themeManagerService) {
        super();
        this.themeManagerService = themeManagerService;
    }

    public void process(final Reader reader, final Writer writer) throws IOException {
        String resourceText = "/* The custom PostProcessor fetched the following SASS vars from the ThemeManagerService: */\n\n"; 
        resourceText += themeManagerService.getFormattedProperties();
        writer.append(resourceText);
        //read in the merged SCSS and add it after the custom content 
        writer.append(IOUtils.toString(reader));
        reader.close();
        writer.close();
    }  
}

到目前为止,这种方法正在按预期/预期工作。希望它对其他人有用。

Wro4j 是一个很棒的工具,非常感谢。

于 2016-01-17T21:23:38.133 回答