HessianConnectionException: (HTTP) ошибка 500 при использовании Hessian 4.0.7 и Spring 3.1.1

Ну никак не могу понять это!

Я использую Spring 3.1.1 и Hessian 4.0.7 для развертывания в Tomcat 6.0.29.

Я создал простой удаленный интерфейс Hessian, но мой тест продолжает терпеть неудачу;

Exception in thread "main" com.caucho.hessian.client.HessianConnectionException: 500: java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8080/client/remote/RemoteService
    at com.caucho.hessian.client.HessianURLConnection.sendRequest(HessianURLConnection.java:142)
    at com.caucho.hessian.client.HessianProxy.sendRequest(HessianProxy.java:283)
    at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:170)
    at $Proxy0.testConnection(Unknown Source)
    at com.qualificationcheck.testserver.TestServer.main(TestServer.java:15)
Caused by: java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8080/client/remote/remoteservice
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at com.caucho.hessian.client.HessianURLConnection.sendRequest(HessianURLConnection.java:122)
    ... 4 more
Caused by: java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8080/client/remote/RemoteService
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at com.caucho.hessian.client.HessianURLConnection.sendRequest(HessianURLConnection.java:109)
    ... 4 more

Мой интерфейс;

public interface QCClientRemoteService {
    public String testConnection(String param);
}

Мой импл;

public class QCClientRemoteServiceImpl implements QCClientRemoteService {
    public String testConnection(String param) {
        return "Recieved param of >" + param + "< successfully.";
    }
}

web.xml содержит;

<servlet>
    <servlet-name>remoting</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/web-app-config.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>remoting</servlet-name>
    <url-pattern>/remote/*</url-pattern>
</servlet-mapping>

И файл web-app-config.xml, который вы там видите, содержит (путем импорта из другого xml);

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

<bean name="/RemoteService" class="org.springframework.remoting.caucho.HessianServiceExporter">
    <property name="service" ref="remoteService"/>
    <property name="serviceInterface" value="com.example.QCClientRemoteService"/>
</bean>

И, наконец, как только это развернуто в tomcat (запускается без ошибок или предупреждений), я вызываю все это из основного метода в другом тестовом приложении с помощью;

String url = "http://localhost:8080/client/remote/RemoteService";

HessianProxyFactory factory = new HessianProxyFactory();
QCClientRemoteService basic = (QCClientRemoteService) factory.create(QCClientRemoteService.class, url);

System.out.println(basic.testConnection("Input 123"));

Любые идеи, почему это не сработает? Очень расстраивает! У следующего парня, похоже, была такая же проблема, но ответа от Каучо не было; http://forum.caucho.com/showthread.php?t=14906

Тестовое приложение определенно достигает сервера веб-приложений, как будто я искажаю URL-адрес, а затем тестовое приложение жалуется на неверный URL-адрес. Однако с сервера вообще не регистрируются журналы, предупреждения или даже отладки. 500 выбрасывается где-то до фактического внедрения!?

Самое интересное в том, что тот же код выше, интегрированный в более старый сервер, на котором мы работаем на Spring 2.0.5, прекрасно работает с Burlap 2.1.12.


person Nick Foote    schedule 11.05.2012    source источник
comment
Такая же проблема, hibernate3.0.8/tomcat6.0.32, но spring 3.1.1. Посещение конечной точки в веб-браузере дает соответствующий ответ HessianServiceExporter only supports POST requests, но гессианский клиент выдает ошибку 500.   -  person theZenPebble    schedule 14.05.2012


Ответы (2)


Проблема заключалась в том, что у меня была включена библиотека spring-remoting 2.0.8, и она где-то конфликтовала (молча). Удаление этого немедленно решило проблему для меня.

Просто чтобы быть явным, приведенная выше конфигурация и тестовый код отлично работают, когда у меня есть следующие библиотеки (обратите внимание, я предполагаю, что не все из них требуются для решения Hessian/Spring, они находятся в моем проекте для других целей, но я перечислил здесь для полноты );

spring-core-3.1.1.RELEASE
spring-asm-3.1.1.RELEASE
spring-web-3.1.1.RELEASE
spring-beans-3.1.1.RELEASE
spring-context-3.1.1.RELEASE
spring-aop-3.1.1.RELEASE
spring-webmvc-3.1.1.RELEASE
spring-context-support-3.1.1.RELEASE
spring-expression-3.1.1.RELEASE
hessian-4.0.7
person Nick Foote    schedule 15.05.2012

Мое решение (после того, как я попробовал различные версии Hessian) состояло в том, чтобы использовать:

org.springframework spring-remoting 2.0.8
org.springframework spring-webmvc/orm/(whatever) 3.1.1.RELEASE
com.caucho hessian 3.0.8

Я использую их в проекте maven, так что это именно те версии, которые я использую, и проблема исчезла. Это определенно похоже на версию с Spring 3.1.1.

Что бы это ни стоило, я использую это с приложением Eclipse RCP, и оно работает с пакетом Eclipse RCP Hessian.

person theZenPebble    schedule 14.05.2012
comment
Попробуйте удалить эту библиотеку spring-remoting, она должна работать с последней версией гессиана 4.0.7. Во всяком случае, работал на меня. Кажется, есть некоторые очень деликатные конфликтные вопросы. - person Nick Foote; 15.05.2012
comment
Я использую его со старым несовместимым клиентом, поэтому мне нужен 3.x, но я рад, что он работает с 4.x. - person theZenPebble; 15.05.2012