huangzy01 opened a new issue #49:
URL: https://github.com/apache/dubbo-hessian-lite/issues/49


   - [x] I have searched the [issues](https://github.com/apache/dubbo/issues) 
of this repository and believe that this is not a duplicate.
   - [x] I have checked the 
[FAQ](https://github.com/apache/dubbo/blob/master/FAQ.md) of this repository 
and believe that this is not a duplicate.
   
   ### Environment
   
   * Dubbo version: 2.7.7
   * Operating System version: xxx
   * Java version: 1.8
   
   ### Steps to reproduce this issue
   
   1. create a REST controller with a param which type is 
org.springframework.data.domain.Pageable
   `import com.example.dubbo.provider.DemoService;
   import org.apache.dubbo.config.annotation.Reference;
   import org.springframework.data.domain.Pageable;
   import org.springframework.web.bind.annotation.GetMapping;
   import org.springframework.web.bind.annotation.RestController;
   
   @RestController
   public class DemoController {
       @Reference(version = "1.0.0", url = "dubbo://127.0.0.1:12345")
       private DemoService demoService;
   
       @GetMapping("/sayHello")
       public void sayHello(Pageable pageable) {
           System.out.println("controller sayHello");
           System.out.println(String.format("pageable: page=%d, size=%d", 
pageable.getPageNumber(), pageable.getPageSize()));
           demoService.sayHello(pageable);
       }
   }`
   
   2. export com.example.dubbo.provider.DemoServiceImpl#sayHello service with 
dubbo protocol on 12345 port 
   `import org.apache.dubbo.config.annotation.Service;
   import org.springframework.data.domain.Pageable;
   
   @Service(version = "1.0.0")
   public class DemoServiceImpl implements DemoService {
       @Override
       public void sayHello(Pageable pageable) {
           System.out.println(String.format("pageable: page=%d, size=%d", 
pageable.getPageNumber(), pageable.getPageNumber()));
       }
   }`
   
   3. call http://localhost:8080/sayHello with no params, on the provider side, 
we get an exception indicate 'org.springframework.data.domain.PageRequest' 
could not be instantiated.
   
   Pls. provide [GitHub address] to reproduce this issue.
   
   ### Expected Result
   
   We expect in the com.example.dubbo.provider.DemoServiceImpl#sayHello method, 
the param can be initial correctly, in this case, it should print "page=0, 
size=20" successfully,which is the default value of an instance of PageRequest 
class.
   
   ### Actual Result
   
   On the provider side ,we get an exception indicate that can NOT initial an 
instance of rg.springframework.data.domain.PageRequest class. 
   
   ```
   2020-08-11 16:00:14.159  WARN 229668 --- [:12345-thread-2] 
o.a.d.r.p.dubbo.DecodeableRpcInvocation  :  [DUBBO] Decode argument failed: 
'org.springframework.data.domain.PageRequest' could not be instantiated, dubbo 
version: 2.7.7, current host: 160.12.11.53
   
   com.alibaba.com.caucho.hessian.io.HessianProtocolException: 
'org.springframework.data.domain.PageRequest' could not be instantiated
        at 
com.alibaba.com.caucho.hessian.io.JavaDeserializer.instantiate(JavaDeserializer.java:317)
 ~[dubbo-2.7.7.jar:2.7.7]
        at 
com.alibaba.com.caucho.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:202)
 ~[dubbo-2.7.7.jar:2.7.7]
        at 
com.alibaba.com.caucho.hessian.io.Hessian2Input.readObjectInstance(Hessian2Input.java:2848)
 ~[dubbo-2.7.7.jar:2.7.7]
        at 
com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2175)
 ~[dubbo-2.7.7.jar:2.7.7]
        at 
com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2104)
 ~[dubbo-2.7.7.jar:2.7.7]
        at 
com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2148)
 ~[dubbo-2.7.7.jar:2.7.7]
        at 
com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2104)
 ~[dubbo-2.7.7.jar:2.7.7]
        at 
org.apache.dubbo.common.serialize.hessian2.Hessian2ObjectInput.readObject(Hessian2ObjectInput.java:100)
 ~[dubbo-2.7.7.jar:2.7.7]
        at 
org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:143)
 [dubbo-2.7.7.jar:2.7.7]
        at 
org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:80)
 [dubbo-2.7.7.jar:2.7.7]
        at 
org.apache.dubbo.remoting.transport.DecodeHandler.decode(DecodeHandler.java:57) 
[dubbo-2.7.7.jar:2.7.7]
        at 
org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:44)
 [dubbo-2.7.7.jar:2.7.7]
        at 
org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:57)
 [dubbo-2.7.7.jar:2.7.7]
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
[na:1.8.0_112]
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
[na:1.8.0_112]
        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_112]
   Caused by: java.lang.reflect.InvocationTargetException: null
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 
Method) ~[na:1.8.0_112]
        at 
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
 ~[na:1.8.0_112]
        at 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
 ~[na:1.8.0_112]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
~[na:1.8.0_112]
        at 
com.alibaba.com.caucho.hessian.io.JavaDeserializer.instantiate(JavaDeserializer.java:313)
 ~[dubbo-2.7.7.jar:2.7.7]
        ... 15 common frames omitted
   Caused by: java.lang.IllegalArgumentException: Page size must not be less 
than one!
        at 
org.springframework.data.domain.AbstractPageRequest.<init>(AbstractPageRequest.java:50)
 ~[spring-data-commons-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        at 
org.springframework.data.domain.PageRequest.<init>(PageRequest.java:43) 
~[spring-data-commons-2.3.2.RELEASE.jar:2.3.2.RELEASE]
        ... 20 common frames omitted
   ```
   After debugged on this, we founded when deserializing params using hessian 
(which is the default serialize method using by dubbo protocol), the size field 
which is int type in PageRequest class was initialled to 0, but the constructor 
of org.springframework.data.domain.PageRequest can not permit this field less 
than one.
   Why hessian can not call the constructor with values of the params received 
from the consumer side,  instead of with initial values?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to