Java RMIについて
既存のPOJOインターフェースをRemoteインターフェースとして公開しようとしたときにおもわぬところで問題となったのが”リモートインターフェースメソッドは、throws RemoteExceptionを定義しなければならない"という制約。
RMIでオブジェクトを公開するには、インターフェース”Remote”を継承した"リモートインターフェース"を定義する必要があるのだが、既存のPOJOインターフェースを公開する場合は、MIXIN(インターフェースの多重実装)してやればいいと軽くかんがえていた。しかし、冒頭の制約のせいで、POJOインターフェースのメソッドのthrows句にRemoteExceptionそのものか、RemoteExceptionの親クラスを宣言しなければならず、せっかくのPOJOインターフェースが汚染されてしまう。
解決策としては
リモートインターフェースとして公開したいPOJOインターフェースを薄く
Wrapするような別のインターフェースを定義するぐらいだな。
//POJOインターフェース public interface Pojo { void hoge(); } //リモートインターフェース(Pojoのラッパー) public interface RemotePojo extends Remote { void hoge() throws RemoteException; } //実装クラス public class RemotePojoImpl implements RemotePojo { private Pojo pojo; public RemotePojoImpl(Pojo pojo) { this.pojo = pojo; } void hoge() throws RemoteException { this.pojo.hoge(); } }
冗長すぎる。ふぅ。やだな。やっぱソケットだな。