java如何覆盖tapestry AlertManager
我已创建扩展警报管理器: 接口
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复制和粘贴所有方法,而不扩展它。但可能有更好的办法吗
# 1 楼答案
根据您的实际需要,您可以通过几种方式实现这一点。我请你阅读documentation和IoC cookbook
理解控制配置的反转非常重要,因为它是一个非常强大的模块
# 2 楼答案
这是因为Tapestry IoC在您尝试仅按接口类型查找实现接口的所有服务时,会尝试查找这些服务。您的新
AlertManagerExt
还实现了AlertManager
,因此存在歧义这通常通过显式地指定服务ID或标记注释来解决,但这不适用于您的情况,因为tapestry的核心代码已经
@Inject
只通过接口AlertManager