2

Spring で RMI を使用していくつかのサービスを公開しています。すべてのサービスには、実際の処理ジョブを実行する他のサービス Bean への依存関係があります。例えば:

<bean id="accountService" class="example.AccountServiceImpl">
    <!-- any additional properties, maybe a DAO? -->
</bean>

<bean id="rmiAccount" class="example.AccountRmiServiceImpl"/>

<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
    <!-- does not necessarily have to be the same name as the bean to be exported -->
    <property name="serviceName" value="AccountService"/>
    <property name="service" ref="accountService"/>
    <property name="serviceInterface" value="example.AccountService"/>
    <!-- defaults to 1099 -->
    <property name="registryPort" value="1199"/>
</bean>

私の AccountRmiServiceImpl は次のようになります。

public class AccountRmiServiceImpl implements AccountRmiService {
    private static final long serialVersionUID = -8839362521253363446L;

    private AccountService accountService;

    @Autowired
    public void setAccountService(AccountService accountService) {
        this.accountService = accountService;
    }
}

私の質問は:マーカー インターフェイスAccountServiceImplを実装せずに作成できますか? Serializableその場合、その参照はAccountRmiServiceImpl一時的なものにする必要があります。これは、RMI 呼び出しが行われているクライアントにシリアライズおよび転送されないことを意味します。出来ますか?

4

1 に答える 1

1

多分。

フィールドを一時的なものとしてマークすることaccountService間違いありません。これにより、実際にシリアル化されて RMI 経由で送信されなくなります (より正確には、シリアル化に失敗して例外がスローされます)。ただし、この時点AccountRmiServiceImplで、反対側で再構築された の accountService の値は null になり、他の変更を行わないとほぼ確実にNullPointerException後で発生します。

AccountServiceImpl(Java の意味で) シリアライズ可能ではないが単純なシリアライズ可能な情報に基づいてそのインスタンスを作成できる場合は、幸運です。writeObject/readObject または writeReplace/readResolve メソッドを使用して、シリアライゼーションを自分で実装できます (詳細については、 Serializableを参照してください)。

のインスタンスがAccountServiceImplあらゆる意味でシリアライズ可能でない場合 (たとえば、インライン ロジックを持つ匿名の内部クラスと、外部スコープ内の final ローカル変数への参照)、これを送信する方法はありません。反対側にはどのようなオブジェクトが再作成されますか? このような状況に陥った場合は、コードをリファクタリングして、クラスをシリアライズ可能にする必要があります。

于 2009-11-16T15:45:20.017 に答える