以下に示すメソッドは、バッチで実行するrun
クラスからのものです。Tutorial_RunbaseBatch
次の変更を加えました。
クラスSysSecurityのメソッドconstructSecurityKeySetを次のように変更しました。
server client static public SecurityKeySet constructSecurityKeySet()
クラスBatchRunのメソッドrunJobStaticを次のように変更しました。
server client static void runJobStatic(recId batchId)
フレームワーククラスをいじってはいけないという事実は承知していますが、これは単なる調査です。次のコードセクションを追加するまではうまくいきました。
コード変更 1:
MenuItemName menuItemName;
AccessType act;
コード変更 2:
act = securitySet.secureNodeAccessmenuItemName,SysSecurity::accessRecType2UtilElementType(AccessRecordType::MenuItemDisplay)); // Line 24
上記のコードセクションを追加した後、以下のエラーメッセージが表示されます
The server-side impersonated (RunAs) session tried to invoke a method that is available for client-side processing only.
(S)\Classes\Tutorial_RunbaseBatch\run - line 24
(S)\Classes\BatchRun\runJobStatic - line 62 //which is batchClass.run();
SecurityKeySet(SystemClass)にはプロパティRunOnが設定さcalledFrom
れており、オブジェクトが呼び出された場所 ( clientまたはserver )で実行されます。Class BatchableおよびBatchRunableにも依存しています。両方のクラスにプロパティRunOn
が設定されていますcalledFrom
クラスのプロパティをサーバーに変更しようとしましたが、うまくいきませんでした
とにかくこのコードを機能させる方法はありますか?
完全なコード:
public void run()
{
SecurityKeySet securitySet;
UserGroupId fromUserGroupId;
DomainId domainId;
MenuItemName menuItemName;
AccessType act;
;
#OCCRetryCount
fromUserGroupId = "XXXX";
domainId = "YYYY";
if (!this.validate())
throw error("");
try
{
ttsbegin;
// this.Update();
securitySet=SysSecurity::constructSecurityKeySet();//error
securitySet.loadGroupRights(fromUserGroupId,domainId);
act = securitySet.secureNodeAccess(menuItemName,SysSecurity::accessRecType2UtilElementType(AccessRecordType::MenuItemDisplay));
ttscommit;
}
catch (Exception::Deadlock)
{
retry;
}
catch (Exception::UpdateConflict)
{
if (appl.ttsLevel() == 0)
{
if (xSession::currentRetryCount() >= #RetryNum)
{
throw Exception::UpdateConflictNotRecovered;
}
else
{
retry;
}
}
else
{
throw Exception::UpdateConflict;
}
}
}