Wro4j:从自定义 post 处理器访问 Spring @Service

Wro4j: Accessing Spring @Service from custom post processor

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

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

问题是我想将确定 SASS 变量的工作交给由 Spring 管理的自定义 ThemeManager @Service。我没有考虑过过滤器将无法看到自动装配的@Service,但情况似乎是这样。

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

有没有办法让 @Service 对过滤器可见,还是我处理方法不对?

感谢您的帮助。

更新:

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

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

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

简单。

此方法 pans/fizzles 结束时我会跟进。

最后,我能够将 spring 托管的 ThemeManagerService 直接提供给自定义 post 处理器,而不是依赖于自定义 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;
}

ThemeManagerService 的构造函数注入 CustomConfigurableWroManagerFactory 意味着它可以传递给自定义 post 处理器,因为它由 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));
    }
}

现在,post 处理器可以访问 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();
    }  
}

到目前为止,此方法的效果与 expected/intended 相同。希望它对其他人派上用场。

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