2009-11-16 4 views
2

봄에 RMI를 사용하는 일부 서비스가 노출됩니다. 모든 서비스는 실제 처리 작업을 수행하는 다른 서비스 빈에 종속됩니다. 예를 들어 :RMI에 노출 된 서비스의 참조가 일시적이어야합니까?

<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; 
    } 
} 

내 질문은 : AccountServiceImplSerializable 마커 인터페이스를 구현하지 않고 생성 될 수 있을까? 그렇다면 AccountRmiServiceImpl에있는 참조를 일시적으로 만들어야합니다. 즉, 직렬화되지 않고 RMI 호출이 수행되는 클라이언트로 전송됩니다. 가능한가?

답변

2

아마도.

당신 확실히 참으로 직렬화 (직렬화로 실패하고 예외를 던지는 또는 더 정확하게,) RMI를 통해 전송되는 것을 중지 할 일시적으로 accountService 필드를 표시합니다. 그러나이 시점에서 다른 쪽에서 재구성 된 AccountRmiServiceImpl은 해당 accountService에 대해 null 값을 가지게됩니다. 다른 값을 변경하지 않으면 나중에 NullPointerException이됩니다.

당신의 AccountServiceImpl이 (자바 의미에서) serialisable없는 경우, 하지만 여전히 몇 가지 간단한 serialisable 정보를 기반의 인스턴스를 만들 수 있습니다, 당신은 행운에있어. writeObject/readObject 또는 writeReplace/readResolve 메소드를 사용하여 직접 직렬화를 구현할 수 있습니다 (자세한 내용은 Serializable 참조).

의 인스턴스가 단어의 어떤 의미로도 직렬화 할 수없는 경우 (예 : 인라인 논리와 익명 내부 클래스 및 외부 범위의 최종 로컬 변수에 대한 참조),이를 전송할 방법이 없습니다. 다른면에는 어떤 종류의 물건이 재현 될까요? 이것이 자신에게 맞는 상황이라면 클래스를 직렬화 할 수 있도록 코드를 리팩터링해야합니다.

+0

답장 dtsazza 주셔서 감사합니다. AccountServiceImpl이 Serializable을 구현한다고 가정 해 보겠습니다. 같은 문제가 있지만 DAO 개체 참조가 다시 발생합니다. DAO 구현은 직렬화 가능하지 않으며 Spring이 이들을 종속으로 삽입하기 때문에이 인터페이스를 구현하게하는 것은 의미가 없다. –

+0

클래스의 * 내용 * (즉, 필드)이 Serializable이 아니면 클래스는 Serializable이 아닙니다. "상향식"으로 행동 할 필요가 있습니다. 그리고 필드 중 하나를 Serializable으로 만들 수 없다면 수동으로 다시 구성 할 수 없다면 운이 없어집니다. 그러나 영구 상태의 일부가 아닌 경우 (예 : 캐시 또는 현재 스레드) 필드를 '일시적'으로 표시하는 것을 잊지 마십시오. –