实现jpetstore物理上分层--续

来源:互联网 发布:2016网络语言大全 编辑:程序博客网 时间:2024/05/16 06:24

由于昨天做了一个远程调用架构的项目工程模板demo,虽然大体上可以跑起来了,但有些地方还是有异常。今天决定找出原因。

在办公室的电脑里,我只有spring1.2.9。可能跟之前的spring2.0有点差距,但在spring1.29上也有一点问题。先把这些问题搞定再说。

问题是这样的,登陆的时候老是抛出异常。见如下:

2008-3-24 1:48:26 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() 
for servlet remoting threw exception
com.caucho.hessian.io.HessianProtocolException: expected string at z
    at com.caucho.hessian.io.HessianInput.error(HessianInput.java:
1226)
    at com.caucho.hessian.io.HessianInput.expect(HessianInput.java:
1221)
    at com.caucho.hessian.io.HessianInput.readString(HessianInput.java:
543)
    at com.caucho.hessian.io.BasicDeserializer.readObject(BasicDeserializer.java:
166)
    at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:
699)
    at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:
181)
    at org.springframework.remoting.caucho.HessianServiceExporter.handleRequest(HessianServiceExporter.java:
91)
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:
44)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:
740)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:
684)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:
394)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:
358)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:
710)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:
803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
104)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
261)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:
844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:
581)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:
447)
    at java.lang.Thread.run(Thread.java:
619)
2008-3-24 1:48:26 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() 
for servlet petstore threw exception
com.caucho.hessian.io.HessianProtocolException: 
    at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:
171)
    at $Proxy0.getAccount(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
    at java.lang.reflect.Method.invoke(Method.java:
597)
    at org.springframework.remoting.caucho.HessianClientInterceptor.invoke(HessianClientInterceptor.java:
115)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:
169)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:
169)
    at $Proxy1.getAccount(Unknown Source)
    at org.springframework.samples.jpetstore.web.spring.OrderFormController.formBackingObject(OrderFormController.java:
45)
    at org.springframework.web.servlet.mvc.AbstractFormController.getErrorsForNewForm(AbstractFormController.java:
341)
    at org.springframework.web.servlet.mvc.AbstractFormController.showNewForm(AbstractFormController.java:
322)
    at org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:
262)
    at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:
153)
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:
44)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:
740)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:
684)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:
394)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:
348)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:
690)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:
803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
104)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
261)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:
844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:
581)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:
447)
    at java.lang.Thread.run(Thread.java:
619)

 百思不得其解!为什么总是执行getAccount(String username, String password)时候抛出异常!?

由于对aop不是很了解,只能是我猜,我猜,我猜猜!是不是代理类出现问题了?再看看源代码,发现方法getAccount被重载了。而且异常信息中有at $Proxy0.getAccount(Unknown Source)。 我想是不是把一个重命名,比如getNewAccount。

一试,果然是这样!

我想,如果存在这样的问题。我们是不是可以参考spring的org.springframework.web.servlet.DispatcherServlet设计,给每个远程业务接口分配一个serviceId,只代理一个叫远程请求分发器的接口RemoteRequestDispatcher,在服务器端RemoteRequestDispatcher的实现类负责根据serviceId将请求转发给相应的类处理。

我的文章列表>>

 

原创粉丝点击