使用 HttpInvokerServiceExporter 给出 500 错误代码
Using HttpInvokerServiceExporter giving 500 error code
过去两天我一直在努力使用 HttpInvokerServiceExporter 公开服务。错误显示 Did not receive successful HTTP response
下面是完整的堆栈跟踪以获取详细信息。代码在 Git 回购中检查。 Link 是 - Github link
org.springframework.remoting.RemoteAccessException: Could not access HTTP invoker remote service at [http://localhost:8080/spring-remoting/AccountService]; nested exception is java.io.IOException: Did not receive successful HTTP response: status code = 500, status message = [Internal Server Error]
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.convertHttpInvokerAccessException(HttpInvokerClientInterceptor.java:216)
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:147)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
com.sun.proxy.$Proxy8.add(Unknown Source)
com.remoting.ClientInvoker.getCube(ClientInvoker.java:9)
org.apache.jsp.process_jsp._jspService(process_jsp.java:118)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
java.io.IOException: Did not receive successful HTTP response: status code = 500, status message = [Internal Server Error]
org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor.validateResponse(SimpleHttpInvokerRequestExecutor.java:185)
org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor.doExecuteRequest(SimpleHttpInvokerRequestExecutor.java:92)
org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.executeRequest(AbstractHttpInvokerRequestExecutor.java:138)
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:194)
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:176)
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:144)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
com.sun.proxy.$Proxy8.add(Unknown Source)
com.remoting.ClientInvoker.getCube(ClientInvoker.java:9)
org.apache.jsp.process_jsp._jspService(process_jsp.java:118)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
我已正确遵循文档并实施了所有步骤。下面是服务界面:
package com.remoting;
public interface AccountService {
public int add(int a, int b);
}
然后服务实现
package com.remoting;
public class AccountServiceImpl implements AccountService {
@Override
public int add(int a, int b) {
return a + b;
}
}
然后web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>spring-remoting</display-name>
<!-- The front controller of this Spring Web application, responsible for
handling all application requests -->
<servlet>
<servlet-name>accountExporter</servlet-name>
<servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>accountExporter</servlet-name>
<url-pattern>/AccountService</url-pattern>
</servlet-mapping>
</web-app>
然后是应用程序bean。应用程序 bean 放置在 applicationContext.xml
和 /WEB-INF/classes
目录中:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<bean id="accountService" class="com.remoting.AccountServiceImpl"></bean>
<bean name="accountExporter"
class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="accountService" />
<property name="serviceInterface" value="com.remoting.AccountService" />
</bean>
<bean id="httpServer"
class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="http://localhost:8080/spring-remoting/AccountService"></property>
<property name="serviceInterface" value="com.remoting.AccountService"></property>
</bean>
</beans>
现在要调用服务,我有两个 jsp 文件和一个助手 class 来加载 bean 并调用函数:
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="process.jsp">
Enter Number:<input type="text" name="number" /> <input type="submit"
value="cube" />
</form>
</body>
</html>
process.jsp
<jsp:include page="index.jsp"></jsp:include>
<hr/>
<%@page import="com.remoting.ClientInvoker"%>
<%
int number=Integer.parseInt(request.getParameter("number"));
out.print("sum of "+number+" is: "+ClientInvoker.sum(number));
%>
终于ClientInvoker
class
package com.remoting;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ClientInvoker {
public static int sum(int number){
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
AccountService service = (AccountService)context.getBean("httpServer");
return service.add(4, 4);
}
}
applicationContext.xml 位于 /WEB-INF/classes
目录中。
请让我知道哪里出错了。
我知道这是一个老问题,但今天我偶然发现 HttpInvokerClientInterceptor
中出现了同样的错误。在我的例子中,原因是服务器和客户端使用了两个不同的 Java 对象版本。由于 Spring's HTTP invoker 使用 Java 对象(反)序列化,请确保服务器和客户端使用相同版本的 objects/classes.
指的是this question,也可以表示只用相同的serialVersionUID
和不同的类。
过去两天我一直在努力使用 HttpInvokerServiceExporter 公开服务。错误显示 Did not receive successful HTTP response
下面是完整的堆栈跟踪以获取详细信息。代码在 Git 回购中检查。 Link 是 - Github link
org.springframework.remoting.RemoteAccessException: Could not access HTTP invoker remote service at [http://localhost:8080/spring-remoting/AccountService]; nested exception is java.io.IOException: Did not receive successful HTTP response: status code = 500, status message = [Internal Server Error]
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.convertHttpInvokerAccessException(HttpInvokerClientInterceptor.java:216)
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:147)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
com.sun.proxy.$Proxy8.add(Unknown Source)
com.remoting.ClientInvoker.getCube(ClientInvoker.java:9)
org.apache.jsp.process_jsp._jspService(process_jsp.java:118)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
java.io.IOException: Did not receive successful HTTP response: status code = 500, status message = [Internal Server Error]
org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor.validateResponse(SimpleHttpInvokerRequestExecutor.java:185)
org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor.doExecuteRequest(SimpleHttpInvokerRequestExecutor.java:92)
org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.executeRequest(AbstractHttpInvokerRequestExecutor.java:138)
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:194)
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:176)
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:144)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
com.sun.proxy.$Proxy8.add(Unknown Source)
com.remoting.ClientInvoker.getCube(ClientInvoker.java:9)
org.apache.jsp.process_jsp._jspService(process_jsp.java:118)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
我已正确遵循文档并实施了所有步骤。下面是服务界面:
package com.remoting;
public interface AccountService {
public int add(int a, int b);
}
然后服务实现
package com.remoting;
public class AccountServiceImpl implements AccountService {
@Override
public int add(int a, int b) {
return a + b;
}
}
然后web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>spring-remoting</display-name>
<!-- The front controller of this Spring Web application, responsible for
handling all application requests -->
<servlet>
<servlet-name>accountExporter</servlet-name>
<servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>accountExporter</servlet-name>
<url-pattern>/AccountService</url-pattern>
</servlet-mapping>
</web-app>
然后是应用程序bean。应用程序 bean 放置在 applicationContext.xml
和 /WEB-INF/classes
目录中:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<bean id="accountService" class="com.remoting.AccountServiceImpl"></bean>
<bean name="accountExporter"
class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="accountService" />
<property name="serviceInterface" value="com.remoting.AccountService" />
</bean>
<bean id="httpServer"
class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="http://localhost:8080/spring-remoting/AccountService"></property>
<property name="serviceInterface" value="com.remoting.AccountService"></property>
</bean>
</beans>
现在要调用服务,我有两个 jsp 文件和一个助手 class 来加载 bean 并调用函数:
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="process.jsp">
Enter Number:<input type="text" name="number" /> <input type="submit"
value="cube" />
</form>
</body>
</html>
process.jsp
<jsp:include page="index.jsp"></jsp:include>
<hr/>
<%@page import="com.remoting.ClientInvoker"%>
<%
int number=Integer.parseInt(request.getParameter("number"));
out.print("sum of "+number+" is: "+ClientInvoker.sum(number));
%>
终于ClientInvoker
class
package com.remoting;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ClientInvoker {
public static int sum(int number){
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
AccountService service = (AccountService)context.getBean("httpServer");
return service.add(4, 4);
}
}
applicationContext.xml 位于 /WEB-INF/classes
目录中。
请让我知道哪里出错了。
我知道这是一个老问题,但今天我偶然发现 HttpInvokerClientInterceptor
中出现了同样的错误。在我的例子中,原因是服务器和客户端使用了两个不同的 Java 对象版本。由于 Spring's HTTP invoker 使用 Java 对象(反)序列化,请确保服务器和客户端使用相同版本的 objects/classes.
指的是this question,也可以表示只用相同的serialVersionUID
和不同的类。