ClassNotFoundException с использованием Spring RMI - PullRequest
2 голосов
/ 20 января 2012

У меня есть два проекта (клиент и сервер), которые пытаются обменять некоторые объекты через Spring RMI в Eclipse Helios. Клиент знает только свои интерфейсы. Аналогичная программа передачи строк работает нормально.

Я следую Spring In Action * Примеры 3-ей редакции , и вместо Spitter предпочитал Twitter :) Объекты отлично работают на сервере, и никто не знает реализаций, только Spring. Странно то, что он выдает исключение ClassNotFoundException, и, похоже, клиент жалуется, что не знает TwitterImpl!

Заранее спасибо за любую помощь!

Трассировка стека:

Exception in thread "main" org.springframework.remoting.RemoteAccessException: Could not access remote service [rmi://localhost/TwitterService]; 
nested exception is java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: twitter.domain.TwitterImpl (no security manager: RMI class loader disabled)
at org.springframework.remoting.rmi.RmiClientInterceptorUtils.convertRmiAccessException(RmiClientInterceptorUtils.java:193)
at org.springframework.remoting.rmi.RmiClientInterceptor.doInvoke(RmiClientInterceptor.java:347)
at org.springframework.remoting.rmi.RmiClientInterceptor.invoke(RmiClientInterceptor.java:259)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy1.getTwitter(Unknown Source)
at twitter.Retrieve.getTwits(Retrieve.java:31)
at twitter.Main.main(Main.java:30)

Клиент rmi.xml

<bean class="org.springframework.remoting.rmi.RmiProxyFactoryBean"
    id="twitterService">
<property name="serviceUrl"
    value="rmi://localhost/TwitterService">
</property>
<property name="serviceInterface"
    value="twitter.service.TwitterService">
</property>


</bean>
<bean id="retrieve" class="twitter.Retrieve">
    <property name="twitterService" ref="twitterService"></property>
</bean>

Сервер rmi.xml

<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
    <property name="service" ref="twitterService" />
    <property name="serviceName" value="TwitterService" />
    <property name="serviceInterface" value="twitter.service.TwitterService" />
</bean>
<bean class="twitter.service.TwitterServiceImpl" id="twitterService">
    <property name="twits">
        ...
    </property>
    <property name="twitters">
        ...
    </property>
</bean>

1 Ответ

4 голосов
/ 24 января 2012

Я просто неправильно понял концепцию RMI.Я думал, что клиент не должен даже знать реализацию класса, получая байт-коды с сервера.Фактически, целью удаленного взаимодействия является доступ к состоянию удаленного объекта, и клиент должен знать реализацию.Бросок исключения ClassNotFound не удивителен.

...