/** {@inheritDoc} */ public Object populate(String entityName, Map<String, Object> params) { Type type = Model.getType(entityName); if (null == type) { throw new RuntimeException(entityName + " was not configured!"); } else { return populate(type.newInstance(), type.getName(), params); } }
/** * {@inheritDoc} 初始化对象指定路径的属性。<br> * 例如给定属性a.b.c,方法会依次检查a a.b a.b.c是否已经初始化 */ public ObjectAndType initProperty(final Object target, String entityName, final String attr) { Object propObj = target; Object property = null; int index = 0; String[] attrs = Strings.split(attr, "."); Type type = Model.getType(entityName); while (index < attrs.length) { try { property = PropertyUtils.getProperty(propObj, attrs[index]); Type propertyType = type.getPropertyType(attrs[index]); // 初始化 if (null == propertyType) { logger.error("Cannot find property type [{}] of {}", attrs[index], propObj.getClass()); throw new RuntimeException( "Cannot find property type " + attrs[index] + " of " + propObj.getClass().getName()); } if (null == property) { property = propertyType.newInstance(); try { PropertyUtils.setProperty(propObj, attrs[index], property); } catch (NoSuchMethodException e) { // Try fix jdk error for couldn't find correct setter when object's Set required type is // diffent with Get's return type declared in interface. Method setter = Reflections.getSetter(propObj.getClass(), attrs[index]); if (null != setter) setter.invoke(propObj, property); else throw e; } } index++; propObj = property; type = propertyType; } catch (Exception e) { throw new RuntimeException(e); } } return new ObjectAndType(property, type); }
/** * 将params中的属性([attr(string)->value(object)],放入到实体类中。 * * <p>如果引用到了别的实体,那么<br> * 如果params中的id为null,则将该实体的置为null.<br> * 否则新生成一个实体,将其id设为params中指定的值。 空字符串按照null处理 */ public Object populate(Object entity, String entityName, Map<String, Object> params) { Type type = Model.getType(entityName); for (final Map.Entry<String, Object> paramEntry : params.entrySet()) { String attr = paramEntry.getKey(); Object value = paramEntry.getValue(); if (value instanceof String) { if (Strings.isEmpty((String) value)) { value = null; } else if (TRIM_STR) { value = ((String) value).trim(); } } // 主键 if (null != type && type.isEntityType() && attr.equals(((EntityType) type).getIdPropertyName())) { if (ValidEntityKeyPredicate.INSTANCE.evaluate(value)) { setValue(attr, value, entity); } else { try { PropertyUtils.setProperty(entity, attr, null); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } continue; } // 普通属性 if (-1 == attr.indexOf('.')) { setValue(attr, value, entity); } else { String parentAttr = Strings.substring(attr, 0, attr.lastIndexOf('.')); try { ObjectAndType ot = initProperty(entity, entityName, parentAttr); if (null == ot) { logger.error("error attr:[" + attr + "] value:[" + value + "]"); continue; } // 属性也是实体类对象 if (ot.getType().isEntityType()) { String foreignKey = ((EntityType) ot.getType()).getIdPropertyName(); if (attr.endsWith("." + foreignKey)) { if (null == value) { setValue(parentAttr, null, entity); } else { Object foreignValue = PropertyUtils.getProperty(entity, attr); // 如果外键已经有值 if (null != foreignValue) { if (!foreignValue.toString().equals(value.toString())) { setValue(parentAttr, null, entity); initProperty(entity, entityName, parentAttr); setValue(attr, value, entity); } } else { setValue(attr, value, entity); } } } else { setValue(attr, value, entity); } } else { setValue(attr, value, entity); } } catch (Exception e) { logger.error("error attr:[" + attr + "] value:[" + value + "]", e); } } if (logger.isDebugEnabled()) logger.debug("populate attr:[{}] value:[{}]", attr, value); } return entity; }