From ccb9ac93f7db357ac7733d502f9b6edb9a6cd2e1 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Sat, 31 Mar 2018 10:33:57 +0800 Subject: [PATCH] =?UTF-8?q?ConvertFactory=E5=A2=9E=E5=8A=A0registerIgnoreA?= =?UTF-8?q?ll=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/convert/ConvertFactory.java | 44 ++++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/src/org/redkale/convert/ConvertFactory.java b/src/org/redkale/convert/ConvertFactory.java index 7cd653138..ed1a0bfdd 100644 --- a/src/org/redkale/convert/ConvertFactory.java +++ b/src/org/redkale/convert/ConvertFactory.java @@ -53,6 +53,9 @@ public abstract class ConvertFactory { private final Set skipIgnores = new HashSet(); + //key:需要屏蔽的字段;value:排除的字段名 + private final ConcurrentHashMap> ignoreAlls = new ConcurrentHashMap(); + private boolean skipAllIgnore = false; protected ConvertFactory(ConvertFactory parent, boolean tiny) { @@ -171,12 +174,19 @@ public abstract class ConvertFactory { public ConvertColumnEntry findRef(AccessibleObject element) { if (element == null) return null; ConvertColumnEntry en = this.columnEntrys.get(element); - if (en != null) return en; + Set onlyColumns = null; + if (element instanceof Method) { + onlyColumns = ignoreAlls.get(((Method) element).getDeclaringClass()); + } else if (element instanceof Field) { + onlyColumns = ignoreAlls.get(((Field) element).getDeclaringClass()); + } + if (en != null && onlyColumns == null) return en; final ConvertType ct = this.getConvertType(); ConvertColumn[] ccs = element.getAnnotationsByType(ConvertColumn.class); + String fieldName = null; if (ccs.length == 0 && element instanceof Method) { final Method method = (Method) element; - String fieldName = readGetSetFieldName(method); + fieldName = readGetSetFieldName(method); if (fieldName != null) { try { ccs = method.getDeclaringClass().getDeclaredField(fieldName).getAnnotationsByType(ConvertColumn.class); @@ -184,8 +194,22 @@ public abstract class ConvertFactory { } } } + if (onlyColumns != null && fieldName == null) { + if (element instanceof Method) { + fieldName = readGetSetFieldName((Method) element); + } else if (element instanceof Field) { + fieldName = ((Field) element).getName(); + } + } + if (ccs.length == 0 && onlyColumns != null && fieldName != null) { + if (!onlyColumns.contains(fieldName)) return new ConvertColumnEntry(fieldName, true); + } for (ConvertColumn ref : ccs) { if (ref.type().contains(ct)) { + if (onlyColumns != null && fieldName != null) { + String realName = ref.name().isEmpty() ? fieldName : ref.name(); + if (!onlyColumns.contains(realName)) return new ConvertColumnEntry(realName, true); + } ConvertColumnEntry entry = new ConvertColumnEntry(ref); if (skipAllIgnore) { entry.setIgnore(false); @@ -318,6 +342,22 @@ public abstract class ConvertFactory { skipIgnores.add(type); } + /** + * 屏蔽指定类所有字段,仅仅保留指定字段
+ * 注意: 该配置优先级高于skipAllIgnore和ConvertColumnEntry配置 + * + * @param type 指定的类 + * @param excludeColumns 需要排除的字段名 + */ + public final void registerIgnoreAll(final Class type, String... excludeColumns) { + Set set = ignoreAlls.get(type); + if (set == null) { + ignoreAlls.put(type, new HashSet<>(Arrays.asList(excludeColumns))); + } else { + set.addAll(Arrays.asList(excludeColumns)); + } + } + public final void register(final Class type, boolean ignore, String... columns) { for (String column : columns) { register(type, column, new ConvertColumnEntry(column, ignore));