(Tapestry v5.3.5)贡献非缓存SymbolSource

时间:2012-09-18 17:40:39

标签: tapestry symbols

我需要我的应用程序从数据库源读取它的配置,但我必须应用自己的缓存机制来满足更新配置和性能的灵活性(无论何时需要值都不会访问数据库)

执行缓存机制的服务是SymbolSourceImpl。因为我需要tapestry来缓存可缓存的值,例如JVM选项。我需要提供另一个符号来源。但是SymbolObjectProvider(由MasterObjectProvider提供)仅保存SymbolSource的一个实例,我无法覆盖SymbolSource默认绑定,因此我考虑将另一个符号对象提供程序提供给{ {1}}正如tapestry使用默认的MasterObjectProvider

但是当我尝试提供自己的符号对象提供程序时出现问题:

SymbolObjectProvider

我的 DBSymbolObjectProvider 构造函数如下所示:

@Contribute(MasterObjectProvider.class)
public static void setupDBSYmbolObjectProviders(OrderedConfiguration<ObjectProvider> configuration) {
    configuration.addInstance("DBSymbol", **DBSymbolObjectProvider**.class, OrderConstraintBuilder.before("Symbol").build());
}

Tapestry已解决public DBSymbolObjectProvider(IDBSymbolSource symbolSource, @Builtin TypeCoercer typeCoercer) { this.symbolSource = symbolSource; this.typeCoercer = typeCoercer; } 但无法解决TypeCoercer并抛出以下异常,这是合乎逻辑的,因为IDBSymbolSource尚未构建以解析MasterObjectProvider。< / p>

IDBSymbolSource

谢谢。

1 个答案:

答案 0 :(得分:1)

即使你让你的自定义SymbolSource工作,我也不认为你可以有一个可更新的符号(我会回过头来讨论你如何做到这一点)。原因是符号如何插入到服务中。它们被插入到字段中,不会转换为间接存取方法。因此,即使您更改了该值,也不会再次调用您的自定义SymbolSource来获取该值。

如何撰写自己的SymbolSource 只需装饰SymbolSource服务

public class AppModule {

    public SymbolSource decorateSymbolSource(
        final SymbolSource symbolSource) {
        return new MyCustomSymbolSource(symbolSource);
    }

}

使用MasterObjectProvider时,它不会保留服务,而是作为对象调用。如果您想使用MasterObjectProvider,仍然总是使用@Local来帮助解决服务和防止递归的本地服务。