2017-03-07 6 views
1

を上書きするにはどうすれば拡張アラートマネージャ作成しました: インタフェースタペストリーの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); 

I例外が発生しました:

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からすべてのメソッドをコピー&ペーストすることはできますが、拡張することはできません。しかし、良い方法があるかもしれませんか?

答えて

0

これは、実際に必要なものに応じて、いくつかの方法で実行できます。 documentationIoC cookbookをお読みください。

Inversion of Controlの設定を理解することは、非常に強力なモジュールであるため、重要です。

+0

私が必要とするのは、サービスの実装からかなり明らかです。私はT5 IoCにかなり精通しています。私がstackoverflowで質問を投稿したのは、私のケースがドキュメントでカバーされていないということです。 – xl0e

1

これは、Tapestry IoCがインターフェイスタイプのみで@Injectにしようとすると、インターフェイスを実装するすべてのサービスを検索しようとするためです。あなたの新しいAlertManagerExtAlertManagerを実装しているため、あいまいさがあります。

これは通常、サービスIDまたはマーカー注釈を明示的に指定することで解決されますが、インタフェースでのみと入力した場合、この場合は機能しません。

関連する問題