Merge branch 'master' of github.com:apache/dubbo-go-hessian2
diff --git a/java_exception/exception.go b/java_exception/exception.go
index 86d5648..30515ef 100644
--- a/java_exception/exception.go
+++ b/java_exception/exception.go
@@ -98,7 +98,7 @@
DeclaringClass string
MethodName string
FileName string
- LineNumber int
+ LineNumber int32
}
//JavaClassName java fully qualified path
diff --git a/java_unknown_exception.go b/java_unknown_exception.go
new file mode 100644
index 0000000..45f5a00
--- /dev/null
+++ b/java_unknown_exception.go
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package hessian
+
+import (
+ "fmt"
+ "sync"
+)
+
+import (
+ "github.com/apache/dubbo-go-hessian2/java_exception"
+)
+
+var mutex sync.Mutex
+
+func checkAndGetException(cls classInfo) (structInfo, bool) {
+
+ if len(cls.fieldNameList) < 4 {
+ return structInfo{}, false
+ }
+ var (
+ throwable structInfo
+ ok bool
+ )
+ var count = 0
+ for _, item := range cls.fieldNameList {
+ if item == "detailMessage" || item == "suppressedExceptions" || item == "stackTrace" || item == "cause" {
+ count++
+ }
+ }
+ // if have these 4 fields, it is throwable struct
+ if count == 4 {
+ if throwable, ok = getStructInfo(cls.javaName); ok {
+ return throwable, true
+ }
+ mutex.Lock()
+ defer mutex.Unlock()
+ RegisterPOJO(newBizException(cls.javaName))
+ if throwable, ok = getStructInfo(cls.javaName); ok {
+ return throwable, true
+ }
+ }
+ return throwable, count == 4
+}
+
+type UnknownException struct {
+ SerialVersionUID int64
+ DetailMessage string
+ SuppressedExceptions []java_exception.Throwabler
+ StackTrace []java_exception.StackTraceElement
+ Cause java_exception.Throwabler
+ name string
+}
+
+// NewThrowable is the constructor
+func newBizException(name string) *UnknownException {
+ return &UnknownException{name: name, StackTrace: []java_exception.StackTraceElement{}}
+}
+
+// Error output error message
+func (e UnknownException) Error() string {
+ return fmt.Sprintf("throw %v : %v", e.name, e.DetailMessage)
+}
+
+//JavaClassName java fully qualified path
+func (e UnknownException) JavaClassName() string {
+ return e.name
+}
+
+// equals to getStackTrace in java
+func (e UnknownException) GetStackTrace() []java_exception.StackTraceElement {
+ return e.StackTrace
+}
diff --git a/list.go b/list.go
index 34c8aec..57aaa96 100644
--- a/list.go
+++ b/list.go
@@ -30,6 +30,10 @@
perrors "github.com/pkg/errors"
)
+import (
+ "github.com/apache/dubbo-go-hessian2/java_exception"
+)
+
var (
listTypeNameMapper = &sync.Map{}
listTypeMapper = map[string]reflect.Type{
@@ -46,6 +50,8 @@
"date": reflect.TypeOf(time.Time{}),
"object": reflect.TypeOf([]Object{}).Elem(),
"java.lang.Object": reflect.TypeOf([]Object{}).Elem(),
+ // exception field
+ "java.lang.StackTraceElement": reflect.TypeOf([]*java_exception.StackTraceElement{}).Elem(),
}
)
diff --git a/object.go b/object.go
index e2ef7b3..2a86820 100644
--- a/object.go
+++ b/object.go
@@ -377,6 +377,7 @@
index, fieldStruct, err := findFieldWithCache(fieldName, typ)
if err != nil {
+ // skip field
d.DecodeValue()
continue
}
@@ -547,6 +548,10 @@
cls = d.classInfoList[idx]
s, ok = getStructInfo(cls.javaName)
if !ok {
+ // exception
+ if s , ok = checkAndGetException(cls); ok {
+ return s.typ, cls, nil
+ }
if !d.isSkip {
err = perrors.Errorf("can not find go type name %s in registry", cls.javaName)
}