如何使用 XML 覆盖实体的元数据以添加额外的 gridVisibleFields?
How to override metadata of an entity using XML in order to add additional gridVisibleFields?
我正在使用 blc.version 5.1.5-GA。
将目标产品添加到产品组时,列表网格仅显示 defaultSku.name
。我想向 listgrid 添加其他信息。
下面是相关的实体定义:
@OneToMany(targetEntity = ProductProductGroupXrefImpl.class, mappedBy = "productGroup",
cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region="blProducts")
@BatchSize(size = 50)
@AdminPresentationAdornedTargetCollection(friendlyName = "ProductGroup_Products",
group = GroupName.Details, order = 3000,
joinEntityClass = "com.broadleafcommerce.merchandisinggroup.domain.ProductProductGroupXrefImpl",
targetObjectProperty = "product",
parentObjectProperty = "productGroup",
gridVisibleFields = {"defaultSku.name"})
protected List<ProductProductGroupXref> productXrefs = new ArrayList<>();
这里有一些我尝试过但没有成功的东西,每个 <mo:field>
块都是我尝试过的单独的东西:
<mo:overrideItem ceilingEntity="org.broadleafcommerce.core.catalog.domain.ProductGroupImpl">
<mo:field name="defaultSku.ean, defaultSku.name">
<mo:gridVisibleField value="productXrefs"/>
</mo:field>
<mo:field name="productXrefs">
<mo:gridVisibleField value="defaultSku.name, defaultSku.ean"/>
</mo:field>
<mo:field name="defaultSku.ean">
<mo:gridVisibleField value="productXrefs"/>
</mo:field>
<mo:field name="productXrefs">
<mo:gridVisibleField value="defaultSku.ean"/>
</mo:field>
</mo:overrideItem>
我每次都重新启动我的 tomcat 服务器以确保实际加载更改。有什么我可以调试和检查以确认这一点吗?
有人有类似的问题,他从来没有能够 XML 重写工作。这个问题也需要回答:
我认为正确的格式是:
<mo:overrideItem ceilingEntity="com.broadleafcommerce.merchandisinggroup.domain.ProductGroup">
<mo:field name="productXrefs">
<mo:gridVisibleField value="defaultSku.name"/>
<mo:gridVisibleField value="defaultSku.ean"/>
</mo:field>
</mo:overrideItem>
请注意,ceilingEntity 是产品组的接口,而不是 Impl。
KeeperofDusk 的回答在技术上回答了原始问题,所以我接受了它,但列表网格仍然没有显示额外的 gridVisibleFields
。 原来我在 ceilingEntity
属性中输入了错误的包名称。
在我的 blc 版本中,ProductGroup
的包在 com.broadleafcommerce.merchandisinggroup.domain
,而不是 org.broadleafcommerce.core.catalog.domain
。
我调试到 AbstractFieldMetadataProvider#getTargetedOverride
。
protected Map<String, MetadataOverride> getTargetedOverride(DynamicEntityDao dynamicEntityDao, String configurationKey, String ceilingEntityFullyQualifiedClassname) {
if (metadataOverrides != null && (configurationKey != null || ceilingEntityFullyQualifiedClassname != null)) {
if (metadataOverrides.containsKey(configurationKey)) {
return metadataOverrides.get(configurationKey);
}
if (metadataOverrides.containsKey(ceilingEntityFullyQualifiedClassname)) {
return metadataOverrides.get(ceilingEntityFullyQualifiedClassname);
}
Class<?> test;
try {
test = Class.forName(ceilingEntityFullyQualifiedClassname);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
if (test.isInterface()) {
//if it's an interface, get the least derive polymorphic concrete implementation
Class<?>[] types = dynamicEntityDao.getAllPolymorphicEntitiesFromCeiling(test);
return metadataOverrides.get(types[types.length-1].getName());
} else {
//if it's a concrete implementation, try the interfaces
Class<?>[] types = test.getInterfaces();
for (Class<?> type : types) {
if (metadataOverrides.containsKey(type.getName())) {
return metadataOverrides.get(type.getName());
}
}
}
}
return null;
}
在这一行:return metadataOverrides.get(types[types.length-1].getName());
我总是得到空值。正确的行为是这一行应该 return 字段的 LinkedHashMap 及其 FieldMetadataOverride
s。
types[types.length-1].getName()
应解析为目标天花板实体的完全限定类名。我尝试在 IDE 中手动评估该行,但一直为空。此时我还没有意识到传入了错误的完全限定类名。
然后我尝试调试到 AdminBasicEntityController 中的控制器端点。
@RequestMapping(value = "/{id}/{collectionField:.*}/add", method = RequestMethod.GET)
public String showAddCollectionItem(HttpServletRequest request, HttpServletResponse response, Model model,
@PathVariable Map<String, String> pathVars,
@PathVariable(value = "id") String id,
@PathVariable(value = "collectionField") String collectionField,
@RequestParam MultiValueMap<String, String> requestParams) throws Exception {
String sectionKey = getSectionKey(pathVars);
String mainClassName = getClassNameForSection(sectionKey);
List<SectionCrumb> sectionCrumbs = getSectionCrumbs(request, sectionKey, id);
ClassMetadata mainMetadata = service.getClassMetadata(getSectionPersistencePackageRequest(mainClassName,
sectionCrumbs, pathVars)).getDynamicResultSet().getClassMetaData();
Property collectionProperty = mainMetadata.getPMap().get(collectionField);
FieldMetadata md = collectionProperty.getMetadata();
事实证明 BLC_ADMIN_SECTION 将节键与用于解析实体元数据的完全限定类名相关联。我以为问题是在 ceiling_entity 列中输入了错误的完全限定类名,所以我将其更改为 org.broadleafcommerce.core.catalog.domain.ProductGroup
,但并没有解决问题。这也没有意义,因为我认为如果是这样的话,任何关于 ProductGroup
的信息都不会在该管理页面中呈现。
最后我去检查那个完全限定的类名是否存在,那时我才意识到我在徒劳地追逐了 10 个小时。
未来的 google 员工吸取的教训是使用自动完成。
我正在使用 blc.version 5.1.5-GA。
将目标产品添加到产品组时,列表网格仅显示 defaultSku.name
。我想向 listgrid 添加其他信息。
下面是相关的实体定义:
@OneToMany(targetEntity = ProductProductGroupXrefImpl.class, mappedBy = "productGroup",
cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region="blProducts")
@BatchSize(size = 50)
@AdminPresentationAdornedTargetCollection(friendlyName = "ProductGroup_Products",
group = GroupName.Details, order = 3000,
joinEntityClass = "com.broadleafcommerce.merchandisinggroup.domain.ProductProductGroupXrefImpl",
targetObjectProperty = "product",
parentObjectProperty = "productGroup",
gridVisibleFields = {"defaultSku.name"})
protected List<ProductProductGroupXref> productXrefs = new ArrayList<>();
这里有一些我尝试过但没有成功的东西,每个 <mo:field>
块都是我尝试过的单独的东西:
<mo:overrideItem ceilingEntity="org.broadleafcommerce.core.catalog.domain.ProductGroupImpl">
<mo:field name="defaultSku.ean, defaultSku.name">
<mo:gridVisibleField value="productXrefs"/>
</mo:field>
<mo:field name="productXrefs">
<mo:gridVisibleField value="defaultSku.name, defaultSku.ean"/>
</mo:field>
<mo:field name="defaultSku.ean">
<mo:gridVisibleField value="productXrefs"/>
</mo:field>
<mo:field name="productXrefs">
<mo:gridVisibleField value="defaultSku.ean"/>
</mo:field>
</mo:overrideItem>
我每次都重新启动我的 tomcat 服务器以确保实际加载更改。有什么我可以调试和检查以确认这一点吗?
有人有类似的问题,他从来没有能够 XML 重写工作。这个问题也需要回答:
我认为正确的格式是:
<mo:overrideItem ceilingEntity="com.broadleafcommerce.merchandisinggroup.domain.ProductGroup">
<mo:field name="productXrefs">
<mo:gridVisibleField value="defaultSku.name"/>
<mo:gridVisibleField value="defaultSku.ean"/>
</mo:field>
</mo:overrideItem>
请注意,ceilingEntity 是产品组的接口,而不是 Impl。
KeeperofDusk 的回答在技术上回答了原始问题,所以我接受了它,但列表网格仍然没有显示额外的 gridVisibleFields
。 原来我在 ceilingEntity
属性中输入了错误的包名称。
在我的 blc 版本中,ProductGroup
的包在 com.broadleafcommerce.merchandisinggroup.domain
,而不是 org.broadleafcommerce.core.catalog.domain
。
我调试到 AbstractFieldMetadataProvider#getTargetedOverride
。
protected Map<String, MetadataOverride> getTargetedOverride(DynamicEntityDao dynamicEntityDao, String configurationKey, String ceilingEntityFullyQualifiedClassname) {
if (metadataOverrides != null && (configurationKey != null || ceilingEntityFullyQualifiedClassname != null)) {
if (metadataOverrides.containsKey(configurationKey)) {
return metadataOverrides.get(configurationKey);
}
if (metadataOverrides.containsKey(ceilingEntityFullyQualifiedClassname)) {
return metadataOverrides.get(ceilingEntityFullyQualifiedClassname);
}
Class<?> test;
try {
test = Class.forName(ceilingEntityFullyQualifiedClassname);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
if (test.isInterface()) {
//if it's an interface, get the least derive polymorphic concrete implementation
Class<?>[] types = dynamicEntityDao.getAllPolymorphicEntitiesFromCeiling(test);
return metadataOverrides.get(types[types.length-1].getName());
} else {
//if it's a concrete implementation, try the interfaces
Class<?>[] types = test.getInterfaces();
for (Class<?> type : types) {
if (metadataOverrides.containsKey(type.getName())) {
return metadataOverrides.get(type.getName());
}
}
}
}
return null;
}
在这一行:return metadataOverrides.get(types[types.length-1].getName());
我总是得到空值。正确的行为是这一行应该 return 字段的 LinkedHashMap 及其 FieldMetadataOverride
s。
types[types.length-1].getName()
应解析为目标天花板实体的完全限定类名。我尝试在 IDE 中手动评估该行,但一直为空。此时我还没有意识到传入了错误的完全限定类名。
然后我尝试调试到 AdminBasicEntityController 中的控制器端点。
@RequestMapping(value = "/{id}/{collectionField:.*}/add", method = RequestMethod.GET)
public String showAddCollectionItem(HttpServletRequest request, HttpServletResponse response, Model model,
@PathVariable Map<String, String> pathVars,
@PathVariable(value = "id") String id,
@PathVariable(value = "collectionField") String collectionField,
@RequestParam MultiValueMap<String, String> requestParams) throws Exception {
String sectionKey = getSectionKey(pathVars);
String mainClassName = getClassNameForSection(sectionKey);
List<SectionCrumb> sectionCrumbs = getSectionCrumbs(request, sectionKey, id);
ClassMetadata mainMetadata = service.getClassMetadata(getSectionPersistencePackageRequest(mainClassName,
sectionCrumbs, pathVars)).getDynamicResultSet().getClassMetaData();
Property collectionProperty = mainMetadata.getPMap().get(collectionField);
FieldMetadata md = collectionProperty.getMetadata();
事实证明 BLC_ADMIN_SECTION 将节键与用于解析实体元数据的完全限定类名相关联。我以为问题是在 ceiling_entity 列中输入了错误的完全限定类名,所以我将其更改为 org.broadleafcommerce.core.catalog.domain.ProductGroup
,但并没有解决问题。这也没有意义,因为我认为如果是这样的话,任何关于 ProductGroup
的信息都不会在该管理页面中呈现。
最后我去检查那个完全限定的类名是否存在,那时我才意识到我在徒劳地追逐了 10 个小时。
未来的 google 员工吸取的教训是使用自动完成。