首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重写tapestry AlertManager

如何重写tapestry AlertManager
EN

Stack Overflow用户
提问于 2017-03-07 15:44:46
回答 2查看 252关注 0票数 2

我已经创建了扩展的警报管理器: interface

代码语言:javascript
复制
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);
}

和实现

代码语言:javascript
复制
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);
    }
}

当我试图通过绑定器绑定它时:

代码语言:javascript
复制
binder.bind(AlertManagerExt.class, AlertManagerExtImpl.class);

我得到了异常:

代码语言:javascript
复制
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中的所有方法,而不需要扩展它。但也许有更好的方法呢?

EN

回答 2

Stack Overflow用户

发布于 2017-03-10 18:14:53

这是因为当您尝试仅按接口类型对接口进行@Inject时,Tapestry IoC会尝试查找实现该接口的所有服务。您的新AlertManagerExt也实现了AlertManager,因此产生了歧义。

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

票数 1
EN

Stack Overflow用户

发布于 2017-03-07 18:09:23

您可以通过几种方式来完成此任务,具体取决于您真正需要的内容。我邀请您阅读documentationIoC cookbook

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42642853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档