我有一个Mondrian服务器webapp并运行来处理MDX查询,从我们的Mondrian架构中定义的OLAP多维数据集中获取数据,并返回前端GUI应用程序所需的XMLA以显示查询的数据。
一切正常,但现在我正在尝试添加权限角色,我偶然发现了一个非常令人困惑的问题。
现在我认为这就像添加另一个参数“role”并发送它一样容易。但是,这给我带来了一个奇怪的错误。
我正在使用SmartGWT连接到Mondrian XMLA服务。
public static OlapConnection getConnection() throws Exception {
Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");
java.util.Properties p = new Properties();
String role = "role1";
p.put("server", "http://domain.be:8080/mondrian/xmla");
p.put("user", "user");
p.put("password", "password");
p.put("role","\""+role+"\"");
String dbUrl = "jdbc:xmla:";
Connection connectionXMLA = DriverManager.getConnection(dbUrl, p);
OlapWrapper wrapper = (OlapWrapper) connectionXMLA;
OlapConnection olapConnection = wrapper.unwrap(OlapConnection.class);
return olapConnection;
角色在架构中定义,该架构也包含多维数据集,如下所示:
<Role name="role1">
<SchemaGrant access="none">
<CubeGrant cube="VehicleSales" access="all"/>
<CubeGrant cube="Contract" access="none"/>
</SchemaGrant>
<Role name="role2">
<SchemaGrant access="none">
<CubeGrant cube="VehicleSales" access="none"/>
<CubeGrant cube="Contract" access="all"/>
</SchemaGrant>
使用“role”参数时,出现此错误:
12:30:50.930 [错误] [smartgwtolap] 12:30:50.928:TMR9:WARN:RPCManager:org.olap4j.OlapException:XMLA
提供商提供了例外:
<faultcode> SOAP-ENV:Server.00HSBB01 </faultcode> <faultstring> XMLA SOAP Body processing error </faultstring> <faultactor> Mondrian </faultactor> <detail> <XA:error xmlns:XA="mondrian sourceforge net"> <code> 00HSBB01 </code> <desc> The Mondrian XML: Mondrian Error:Internal error: Rowset 'DISCOVER_PROPERTIES' does not support property 'Roles' </desc> </XA:error> </detail> </SOAP-ENV:Fault>
请求是: DISCOVER_PROPERTIES &安培; QUOT;基于role1&安培; QUOT; 数据 undefined - 响应:{operationId: “listCubes_fetch”,clientContext:Obj,context:Obj, transactionNum:0,httpResponseCode:200,httpResponseText: “//isc_RPCResponseStart-->[{"data":"org.o..."[1497] xmlHttpRequest:obj,transport:“xmlHttpRequest”,状态: -1,clientOnly:undef,httpHeaders:Obj,isStructured:true,callbackArgs:null,结果:Obj,data: “org.olap4j.OlapException:XMLA提供程序......”[1243], invalidateCache:false,isDSResponse:true,queueStatus:-1,startRow: 0,endRow:0,totalRows:0} com.smartgwt.client.core.JsObject $ SGWT_WARN: 12:30:50.928:TMR9:WARN:RPCManager:org.olap4j.OlapException:XMLA 提供者例外: SOAP-ENV:Server.00HSBB01 XMLA SOAP Body处理错误 蒙德里安
00HSBB01
Mondrian XML:Mondrian错误:内部错误:行集“DISCOVER_PROPERTIES”不支持属性“角色”
要求是: DISCOVER_PROPERTIES &安培; QUOT;基于role1&安培; QUOT; 数据 undefined - 响应:{operationId: “listCubes_fetch”,clientContext:Obj,context:Obj, transactionNum:0,httpResponseCode:200,httpResponseText: “//isc_RPCResponseStart-->[{"data":"org.o..."[1497] xmlHttpRequest:obj,transport:“xmlHttpRequest”,状态: -1,clientOnly:undef,httpHeaders:Obj,isStructured:true,callbackArgs:null,结果:Obj,data: “org.olap4j.OlapException:XMLA提供程序......”[1243], invalidateCache:false,isDSResponse:true,queueStatus:-1,startRow: 0,endRow:0,totalRows:0} at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) 在com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:105) 在com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) 在com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172) 在com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293) 在com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547) 在com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364) 在java.lang.Thread.run(未知来源)
其他随机参数,例如“foo”或“bar”,不会返回任何错误,只会被忽略。所以“角色”肯定会引发某些事情,但遗憾的是我无法解决任何问题。
任何可以提供一些见解的人?这是非常赞赏。 我找到了Pentaho XmlaHandler的一些东西,它接受了一个角色作为参数,但这似乎是蒙德里安内部使用的东西,而不一定是我可以在SmartGWT中立即使用的东西 - 我认为。
感谢阅读!
以下代码段会返回错误:
java.lang.RuntimeException:org.olap4j.OlapException:无法获取数据库产品名称。
Connection connectionXMLA = DriverManager.getConnection(dbUrl, p);
OlapWrapper wrapper = (OlapWrapper) connectionXMLA;
OlapConnection olapConnection = wrapper.unwrap(OlapConnection.class);
String role = "role2";
olapConnection.setRoleName(role);
return olapConnection;
getAvailableRoleNames()函数确实返回模式文件中指定的角色。 如果我注释掉setRoleName(角色)部分它就可以了。