我在Pentaho中有一个元数据层。我正在使用Pentaho元数据编辑器来编辑元数据。当我导出元数据并将其发布到双服务器时,双服务器无法刷新元数据,并告诉我“已重新加载0个解决方案的报告元数据。”
在服务器日志中,尝试处理元数据时会有一个堆栈跟踪:
ERROR [org.pentaho.platform.plugin.services.metadata.MetadataDomainRepository] !MetadataPublisher.ERROR_0001_COULD_NOT_LOAD!
java.lang.NullPointerException
at org.pentaho.metadata.model.LogicalModel.findLogicalTable(LogicalModel.java:146)
at org.pentaho.metadata.util.XmiParser.parseXmi(XmiParser.java:1238)
at org.pentaho.platform.plugin.services.metadata.MetadataDomainRepository.loadMetadata(MetadataDomainRepository.java:225)
at org.pentaho.platform.plugin.services.metadata.MetadataDomainRepository.reloadLegacyDomains(MetadataDomainRepository.java:187)
at org.pentaho.platform.plugin.services.metadata.MetadataDomainRepository.reloadDomains(MetadataDomainRepository.java:126)
at org.pentaho.platform.plugin.services.metadata.SessionCachingMetadataDomainRepository.reloadDomains(SessionCachingMetadataDomainRepository.java:219)
at org.pentaho.platform.engine.services.metadata.MetadataPublisher.publish(MetadataPublisher.java:73)
at org.pentaho.platform.engine.core.system.BasePublisher.publish(BasePublisher.java:37)
at org.pentaho.platform.engine.core.system.PentahoSystem.publish(PentahoSystem.java:881)
at org.pentaho.mantle.server.MantleServlet.refreshMetadata(MantleServlet.java:195)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:562)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:188)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:224)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
代码的相关部分似乎是XmiParser中的方法。这是相关代码:
if (dimensionedObject != null)
{
NodeList bizcols = dimensionedObject.getElementsByTagName("CWMMDB:DimensionedObject");
LogicalColumn col;
String pcol;
for (int i = 0; i < bizcols.getLength(); i++)
{
Element bizcol = (Element)bizcols.item(i);
col = new LogicalColumn();
col.setId(bizcol.getAttribute("name"));
xmiConceptMap.put(bizcol.getAttribute("xmi.id"), col);
bindParentConcept(bizcol, domain, col);
Map<String, String> nvp = getKeyValuePairs(bizcol, "CWM:TaggedValue", "tag", "value");
String biztbl = (String)nvp.get("BUSINESS_COLUMN_BUSINESS_TABLE");
pcol = (String)nvp.get("BUSINESS_COLUMN_PHYSICAL_COLUMN_NAME");
// the next line with the LogicalTable is line 1238 which crashes!!!!!
LogicalTable parent = logicalModel.findLogicalTable(biztbl);
if (parent != null)
{
col.setLogicalTable(parent);
parent.addLogicalColumn(col);
for (IPhysicalColumn phycol : parent.getPhysicalTable().getPhysicalColumns()) {
if (phycol.getId().equals(pcol))
{
col.setPhysicalColumn(phycol);
break;
}
}
}
}
}
当我浏览导出的xml文件并搜索“ BUSINESS_COLUMN_BUSINESS_TABLE”或“ BUSINESS_COLUMN_PHYSICAL_COLUMN_NAME”时,发现接近10,000个匹配项(导出的元数据大20 MB,并且有数百个表)。那么,如何查找损坏的表或元数据映射? stacktrace没有给出在我的元数据层中无效的行号。我导出的元数据xml文件确实将xmllint传递为有效xml。