Java 如何覆盖tapestry AlertManager

Java 如何覆盖tapestry AlertManager,java,tapestry,Java,Tapestry,我已创建扩展警报管理器: 接口 public interface AlertManagerExt extends AlertManager { void successCode(String messageCode, Object... args); void infoCode(String messageCode, Object... args); void warnCode(String messageCode, Object... args); void e

我已创建扩展警报管理器: 接口

public interface AlertManagerExt extends AlertManager {
    void successCode(String messageCode, Object... args);
    void infoCode(String messageCode, Object... args);
    void warnCode(String messageCode, Object... args);
    void errorCode(String messageCode, Object... args);
}
和实施

public class AlertManagerExtImpl extends AlertManagerImpl implements AlertManagerExt {

    private final Messages messages;

    public AlertManagerExtImpl(ApplicationStateManager asm, Request request, AjaxResponseRenderer ajaxResponseRenderer,
            PerthreadManager perThreadManager, Messages messages) {
        super(asm, request, ajaxResponseRenderer, perThreadManager);
        this.messages = messages;
    }

    @Override
    public void successCode(String messageCode, Object... args) {
        success(getMessage(messageCode, args));
    }

    @Override
    public void infoCode(String messageCode, Object... args) {
        info(getMessage(messageCode, args));
    }

    @Override
    public void warnCode(String messageCode, Object... args) {
        warn(getMessage(messageCode, args));
    }

    @Override
    public void errorCode(String messageCode, Object... args) {
        error(getMessage(messageCode, args));
    }

    protected String getMessage(String code, Object... args) {
        if (args.length > 0) {
            return messages.format(code, args);
        }
        return messages.get(code);
    }
}
当我试图通过活页夹将其绑定时:

binder.bind(AlertManagerExt.class, AlertManagerExtImpl.class);
我有一个例外:

java.lang.RuntimeException: Service interface org.apache.tapestry5.alerts.AlertManager is matched by 2 services: AlertManager, AlertManagerExtImpl.  Automatic dependency resolution requires that exactly one service implement the interface.
at org.apache.tapestry5.ioc.internal.RegistryImpl.getServiceByTypeAlone(RegistryImpl.java:789)
at org.apache.tapestry5.ioc.internal.RegistryImpl.getServiceByTypeAndMarkers(RegistryImpl.java:797)
at org.apache.tapestry5.ioc.internal.RegistryImpl.getService(RegistryImpl.java:755)

我知道我可以从AlertManager复制和粘贴所有方法,而不扩展它。但可能有更好的方法吗?

根据您的实际需要,您可以通过几种方法来实现这一点。我邀请你阅读这本书


理解控制反转配置非常重要,因为它是一个非常强大的模块。

这是因为Tapestry IoC在您尝试仅按接口类型注入接口时,试图查找实现接口的所有服务。新的
AlertManagerExt
还实现了
AlertManager
,因此不明确


这通常通过显式指定服务ID或标记注释来解决,但这不适用于您的情况,因为tapestry的核心代码已经
@Inject
ing
AlertManager
仅通过接口。

从服务实现的源代码来看,我需要的是非常明显的。我对T5国际奥委会非常熟悉,我在stackoverflow中发布问题的原因是我的案例没有包含在文档中。