使用 Apache HttpClient Api 时 Java 对象的反序列化不起作用
Deserialization of the Java object in using Apache HttpClient Api is not working
我是 Spring MVC 的新手。我正在使用 Spring 版本 4.1.6 并在 tomcat 7 上为开发环境部署了我的两个 Web 应用程序 A 和 B。但在实际生产环境中,应用A会部署在weblogic上,应用B会部署在websphere上。下面是开发环境中出现的场景。
我从应用程序 A 提交了 jsp 页面并调用了控制器的以下方法。通过这种方法,我创建了 HttpPost 请求并使用 ApacheHttpClient api.This 将 RequestDetails 域对象发送到另一个控制器的方法 api.This 是来自发送方或应用程序 A 的控制器的代码。
@RequestMapping(value="/httprequestJinesh.cvr",method = RequestMethod.POST)
public @ResponseBody String createMediaRequest(@RequestBody RequestDetails requestDetails ,HttpServletRequest request, HttpServletResponse response ) throws Exception{
System.out.println("****************** createMediaRequest Method of the controller gets invoked 123 *****************");
if(requestDetails!=null){
System.out.println("******************* Requestdetails Is Been Object is been received ***************" + requestDetails.getRequestId());
}
//Sending the HttpPostRequest
StringBuilder url = new StringBuilder();
String serverUrl = "http://localhost:8080/raws/createMediaRequest.raws"; //get it from app_properpties table
url.append(serverUrl);
System.out.println("************** Started creating the Httpost request ********************");
final HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 10000);
HttpClient httpClient = new DefaultHttpClient(httpParams);
HttpPost httppostRequest = new HttpPost(serverUrl);
httppostRequest.setEntity(new SerializableEntity(requestDetails,false));
System.out.println("************** Finished creating the Http Post request ********************");
System.out.println("*********** Before sending the Httppost Request ******************");
HttpResponse httpResponse = httpClient.execute(httppostRequest);
System.out.println("*********** After sending teh Httppost Request ******************");
return "SUCCESS";
}
在接收方应用程序的控制器上,我正在尝试反序列化 POST 请求中接收到的域对象。应用程序 A 和 B 都在工作区中提供了 RequestDetails class,但在这两种情况下,域对象的包层次结构都是 different.Say,例如在应用程序中,RequestDetails 对象在 com.test,在应用程序 B 中,它在 com.test123 中可用。下面是接收器应用程序控制器上的代码。
RequestMapping(value = "/createMediaRequest.raws", method = RequestMethod.POST)
public Object createMediaRequest(HttpServletRequest request, HttpServletResponse response){
System.out.println("***************** MediaWorkflowController Received Media Request *******************");
try{
ObjectInputStream in = new ObjectInputStream(request.getInputStream());
RequestDetails requestDetails=(RequestDetails)in.readObject();
if(requestDetails!=null){
System.out.println("requestdetails object is not null *******************" + requestDetails.getRequestId());
}
}
catch(Exception e){
e.printStackTrace();
}
return null;
}
下面是应用程序 A
上 RequestDetails.java 的代码
package com.test;
public class RequestDetails implements java.io.Serializable{
String requestId;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
}
下面是应用程序 B
上 RequestDetails.java 的代码
package com.test123;
public class RequestDetails implements java.io.Serializable{
String requestId;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
}
当接收器应用程序的控制器代码被执行时,我收到以下异常。
****************** createMediaRequest Method of the controller gets invoked 123 *****************
******************* Requestdetails Is Been Object is been received ***************12345
************** Started creating the Httpost request ********************
************** Finished creating the Http Post request ********************
*********** Before sending the Httppost Request ******************
***************** MediaWorkflowController Received Media Request *******************
java.lang.ClassNotFoundException: com.test.RequestDetails
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:274)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:625)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at com.cira.raws.mediawf.api.services.controller.MediaWFController.createMediaRequest(MediaWFController.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
*********** After sending teh Httppost Request ******************
据我了解,反序列化对象时出现了问题。如果我在 RequestDetails class 的两侧都保持相同的包层次结构,那么代码可以正常工作 fine.Is RequestDetails 域对象必须具有相同的包层次结构吗?如果没有如何解决我面临的问题?
要反序列化对象,您需要在两个实例中具有相同的 class。这包括 class.
的包名称
正如您所说的包不同那么您看到的故障很容易理解。
我是 Spring MVC 的新手。我正在使用 Spring 版本 4.1.6 并在 tomcat 7 上为开发环境部署了我的两个 Web 应用程序 A 和 B。但在实际生产环境中,应用A会部署在weblogic上,应用B会部署在websphere上。下面是开发环境中出现的场景。
我从应用程序 A 提交了 jsp 页面并调用了控制器的以下方法。通过这种方法,我创建了 HttpPost 请求并使用 ApacheHttpClient api.This 将 RequestDetails 域对象发送到另一个控制器的方法 api.This 是来自发送方或应用程序 A 的控制器的代码。
@RequestMapping(value="/httprequestJinesh.cvr",method = RequestMethod.POST)
public @ResponseBody String createMediaRequest(@RequestBody RequestDetails requestDetails ,HttpServletRequest request, HttpServletResponse response ) throws Exception{
System.out.println("****************** createMediaRequest Method of the controller gets invoked 123 *****************");
if(requestDetails!=null){
System.out.println("******************* Requestdetails Is Been Object is been received ***************" + requestDetails.getRequestId());
}
//Sending the HttpPostRequest
StringBuilder url = new StringBuilder();
String serverUrl = "http://localhost:8080/raws/createMediaRequest.raws"; //get it from app_properpties table
url.append(serverUrl);
System.out.println("************** Started creating the Httpost request ********************");
final HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 10000);
HttpClient httpClient = new DefaultHttpClient(httpParams);
HttpPost httppostRequest = new HttpPost(serverUrl);
httppostRequest.setEntity(new SerializableEntity(requestDetails,false));
System.out.println("************** Finished creating the Http Post request ********************");
System.out.println("*********** Before sending the Httppost Request ******************");
HttpResponse httpResponse = httpClient.execute(httppostRequest);
System.out.println("*********** After sending teh Httppost Request ******************");
return "SUCCESS";
}
在接收方应用程序的控制器上,我正在尝试反序列化 POST 请求中接收到的域对象。应用程序 A 和 B 都在工作区中提供了 RequestDetails class,但在这两种情况下,域对象的包层次结构都是 different.Say,例如在应用程序中,RequestDetails 对象在 com.test,在应用程序 B 中,它在 com.test123 中可用。下面是接收器应用程序控制器上的代码。
RequestMapping(value = "/createMediaRequest.raws", method = RequestMethod.POST)
public Object createMediaRequest(HttpServletRequest request, HttpServletResponse response){
System.out.println("***************** MediaWorkflowController Received Media Request *******************");
try{
ObjectInputStream in = new ObjectInputStream(request.getInputStream());
RequestDetails requestDetails=(RequestDetails)in.readObject();
if(requestDetails!=null){
System.out.println("requestdetails object is not null *******************" + requestDetails.getRequestId());
}
}
catch(Exception e){
e.printStackTrace();
}
return null;
}
下面是应用程序 A
上 RequestDetails.java 的代码package com.test;
public class RequestDetails implements java.io.Serializable{
String requestId;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
}
下面是应用程序 B
上 RequestDetails.java 的代码package com.test123;
public class RequestDetails implements java.io.Serializable{
String requestId;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
}
当接收器应用程序的控制器代码被执行时,我收到以下异常。
****************** createMediaRequest Method of the controller gets invoked 123 *****************
******************* Requestdetails Is Been Object is been received ***************12345
************** Started creating the Httpost request ********************
************** Finished creating the Http Post request ********************
*********** Before sending the Httppost Request ******************
***************** MediaWorkflowController Received Media Request *******************
java.lang.ClassNotFoundException: com.test.RequestDetails
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:274)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:625)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at com.cira.raws.mediawf.api.services.controller.MediaWFController.createMediaRequest(MediaWFController.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
*********** After sending teh Httppost Request ******************
据我了解,反序列化对象时出现了问题。如果我在 RequestDetails class 的两侧都保持相同的包层次结构,那么代码可以正常工作 fine.Is RequestDetails 域对象必须具有相同的包层次结构吗?如果没有如何解决我面临的问题?
要反序列化对象,您需要在两个实例中具有相同的 class。这包括 class.
的包名称正如您所说的包不同那么您看到的故障很容易理解。