如何在SAP Hybris中通过AttributeDescriptorModel获取属性值?
SAP Hybris嵌套AddressModel属性提取解决方案
识别AddressModel类型属性
通过AttributeDescriptorModel的getAttributeType()拿到属性类型,判断其代码是否为AddressModel的默认类型码address(自定义扩展可能有变更,需确认):TypeModel attrType = attrDescriptor.getAttributeType(); if ("address".equals(attrType.getCode())) { // 进入地址属性处理逻辑 }获取AddressModel实例
用属性的getQualifier()拿到字段名,从订单模型中取出对应的地址对象:String addressField = attrDescriptor.getQualifier(); AddressModel address = (AddressModel) orderModel.getProperty(addressField);提取地址详情属性
直接调用AddressModel的getter方法获取所需字段:String street = address.getStreetname(); String postalCode = address.getPostalcode(); String district = address.getDistrict(); // 城市、国家等属性同理调用对应getter拦截列表赋值的实现
如果是在遍历属性生成展示列表的逻辑中,加入类型判断并处理:// 假设orderType是订单的类型模型,orderModel是当前订单实例 for (AttributeDescriptorModel attr : orderType.getAttributeDescriptors()) { Object propValue = orderModel.getProperty(attr.getQualifier()); if (propValue instanceof AddressModel) { AddressModel addr = (AddressModel) propValue; // 将地址属性拆分添加到展示列表 displayList.add("街道:" + addr.getStreetname()); displayList.add("邮编:" + addr.getPostalcode()); // 跳过原地址对象的直接添加,避免展示模型对象本身 continue; } // 处理普通订单属性的赋值 displayList.add(attr.getName() + ": " + propValue); }
额外提示
- 若使用FlexibleSearch查询,可直接关联Address表一次性取出所需字段,减少Java代码转换步骤:
SELECT {o.code}, {c.name}, {a.streetname}, {a.postalcode} FROM {Order AS o JOIN Customer AS c ON {o.user}={c.pk} JOIN Address AS a ON {o.deliveryAddress}={a.pk}} - AddressModel的类型码可通过Backoffice的Type System模块确认,若有自定义扩展需对应修改判断逻辑。
内容的提问来源于stack exchange,提问作者buencamino
相关产品推荐
相关产品推荐

