diff --git a/src/org/redkale/convert/Factory.java b/src/org/redkale/convert/Factory.java index 3e790a29f..56be011a1 100644 --- a/src/org/redkale/convert/Factory.java +++ b/src/org/redkale/convert/Factory.java @@ -129,12 +129,23 @@ public abstract class Factory { return this; } - public ConvertColumnEntry findRef(AccessibleObject field) { - if (field == null) return null; - ConvertColumnEntry en = this.columnEntrys.get(field); + public ConvertColumnEntry findRef(AccessibleObject element) { + if (element == null) return null; + ConvertColumnEntry en = this.columnEntrys.get(element); if (en != null) return en; final ConvertType ct = this.getConvertType(); - for (ConvertColumn ref : field.getAnnotationsByType(ConvertColumn.class)) { + ConvertColumn[] ccs = element.getAnnotationsByType(ConvertColumn.class); + if (ccs.length == 0 && element instanceof Method) { + final Method method = (Method) element; + String fieldName = readGetSetFieldName(method); + if (fieldName != null) { + try { + ccs = method.getDeclaringClass().getDeclaredField(fieldName).getAnnotationsByType(ConvertColumn.class); + } catch (Exception e) { //说明没有该字段,忽略异常 + } + } + } + for (ConvertColumn ref : ccs) { if (ref.type().contains(ct)) { ConvertColumnEntry entry = new ConvertColumnEntry(ref); if (skipAllIgnore) { @@ -142,13 +153,26 @@ public abstract class Factory { return entry; } if (skipIgnores.isEmpty()) return entry; - if (skipIgnores.contains(((Member) field).getDeclaringClass())) entry.setIgnore(false); + if (skipIgnores.contains(((Member) element).getDeclaringClass())) entry.setIgnore(false); return entry; } } return null; } + static String readGetSetFieldName(Method method) { + if (method == null) return null; + String fname = method.getName(); + if (!fname.startsWith("is") && !fname.startsWith("get") && !fname.startsWith("set")) return fname; + fname = fname.substring(fname.startsWith("is") ? 2 : 3); + if (fname.length() > 1 && !(fname.charAt(1) >= 'A' && fname.charAt(1) <= 'Z')) { + fname = Character.toLowerCase(fname.charAt(0)) + fname.substring(1); + } else if (fname.length() == 1) { + fname = "" + Character.toLowerCase(fname.charAt(0)); + } + return fname; + } + final String getEntity(Class clazz) { ConvertEntity ce = (ConvertEntity) clazz.getAnnotation(ConvertEntity.class); if (ce != null && findEntity(ce.value()) == null) entitys.put(ce.value(), clazz); diff --git a/src/org/redkale/convert/ObjectDecoder.java b/src/org/redkale/convert/ObjectDecoder.java index f391fd32b..83bee3bb1 100644 --- a/src/org/redkale/convert/ObjectDecoder.java +++ b/src/org/redkale/convert/ObjectDecoder.java @@ -87,7 +87,7 @@ public final class ObjectDecoder implements Decodeable implements Encodeable implements Encodeable 1 && !(fname.charAt(1) >= 'A' && fname.charAt(1) <= 'Z')) { - fname = Character.toLowerCase(fname.charAt(0)) + fname.substring(1); - } else if (fname.length() == 1) { - fname = "" + Character.toLowerCase(fname.charAt(0)); - } - return fname; - } - static String[] findConstructorProperties(Creator creator) { try { Creator.ConstructorParameters cps = creator.getClass().getMethod("create", Object[].class).getAnnotation(Creator.ConstructorParameters.class); @@ -266,7 +253,7 @@ public final class ObjectEncoder implements Encodeable implements Encodeable