apache / dubbo-hessian-lite

Hessian Lite for Apache Dubbo
Apache License 2.0
53 stars 47 forks source link

hessian can NOT initial org.springframework.data.domain.Pageable correctly #49

Open huangzy01 opened 4 years ago

huangzy01 commented 4 years ago

Environment

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);
}

}`

  1. 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())); } }`

  1. 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?