J'expose certains services en utilisant RMI sur Spring. Chaque service a une dépendance à l'autre bean de service qui effectue le travail de traitement réel. Par exemple:Les références des services exposés RMI doivent-elles être transitoires?
<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>
Mon AccountRmiServiceImpl ressemble à ceci:
public class AccountRmiServiceImpl implements AccountRmiService {
private static final long serialVersionUID = -8839362521253363446L;
private AccountService accountService;
@Autowired
public void setAccountService(AccountService accountService) {
this.accountService = accountService;
}
}
Ma question est la suivante: pourrait AccountServiceImpl
être créé sans mettre en oeuvre l'interface marqueur Serializable
? Si c'est le cas, alors sa référence dans AccountRmiServiceImpl
devrait être rendue transitoire. Cela signifie qu'il ne sera pas sérialisé et transféré au client où l'invocation RMI est faite. C'est possible?
Merci pour la réponse dtsazza. Disons que AccountServiceImpl met en œuvre Serializable. Le même problème se reproduit mais maintenant avec des références d'objet DAO. Les implémentations DAO ne sont pas sérialisables et cela n'a aucun sens de les implémenter car Spring les injecte en tant que dépendances. –
Si les * contenus * (champs) d'une classe ne sont pas sérialisables, la classe n'est pas sérialisable. Vous devez agir "de bas en haut" - et si vous ne pouvez pas faire un des champs "Serializable" * et * ne peut pas le reconstituer manuellement, alors vous n'avez pas de chance. N'oubliez pas de marquer les champs comme «transitoire» s'ils ne font pas partie de l'état persistant (par exemple, les caches ou le thread actuel). –