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



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

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

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

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

有没有办法使@Service对过滤器可见,还是我以错误的方式接近了这一点?

感谢您的任何帮助。

更新:

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

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

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

简单。

当这种方法平移/失败时,我会跟进。

最后,我能够将弹簧管理的 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;
}

构造函数将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: */nn"; 
        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是一个很棒的工具,非常感谢。

相关内容

  • 没有找到相关文章

最新更新