diff --git a/pkg/hessian2/parameter.go b/pkg/hessian2/parameter.go index 95f723d5..2b684cec 100644 --- a/pkg/hessian2/parameter.go +++ b/pkg/hessian2/parameter.go @@ -264,6 +264,8 @@ func (p *Parameter) getTypeByValue() string { return "[B" case time.Time: return "java.util.Date" + case *time.Time: + return "java.util.Date" case []time.Time: return "[Ljava.util.Date" case string: diff --git a/pkg/hessian2/response.go b/pkg/hessian2/response.go index b93d22be..0e15d1a3 100644 --- a/pkg/hessian2/response.go +++ b/pkg/hessian2/response.go @@ -134,6 +134,12 @@ func setValue(dest, v reflect.Value) { } vType := v.Type() + // get the real value and real type + if vType.String() == "interface {}" { + realIntf := v.Interface() + v = reflect.ValueOf(realIntf) + vType = v.Type() + } destType := dest.Type() // for most cases, the types are the same and can set the value directly. diff --git a/pkg/hessian2/response_test.go b/pkg/hessian2/response_test.go index 8c9915b5..037bc83a 100644 --- a/pkg/hessian2/response_test.go +++ b/pkg/hessian2/response_test.go @@ -22,6 +22,9 @@ package hessian2 import ( "reflect" "testing" + "time" + + "github.com/stretchr/testify/assert" ) func TestReflectResponse(t *testing.T) { @@ -390,6 +393,36 @@ func TestReflectResponse(t *testing.T) { } }, }, + { + desc: "[]time.Time", + testFunc: func(t *testing.T, expectedErr bool) { + var dest []time.Time + src := []interface{}{ + time.Unix(1000, 0), + time.Unix(1001, 0), + } + testReflectResponse(t, src, &dest, expectedErr) + assert.Equal(t, len(src), len(dest)) + for i, ptr := range dest { + assert.Equal(t, src[i], ptr) + } + }, + }, + { + desc: "[]*time.Time", + testFunc: func(t *testing.T, expectedErr bool) { + var dest []*time.Time + src := []interface{}{ + time.Unix(1000, 0), + time.Unix(1001, 0), + } + testReflectResponse(t, src, &dest, expectedErr) + assert.Equal(t, len(src), len(dest)) + for i, ptr := range dest { + assert.Equal(t, src[i], *ptr) + } + }, + }, } for _, test := range tests {