091502CC8D7F487BA52A08145ED03720
  • Thomas Pollinger
  • 26.01.2018
  • DE/EN

Root Cause Analysis: "Parameter null objectToReflect" (Update)

Im Artikel Root Cause Analysis: "Parameter null: objectToReflect" habe ich geschrieben, dass man die Ursache für diese Meldung in einem kommenden Update fixt. Jedoch gibt es noch eine weitere Ursache, welche diese Meldung im wsms.log auslöst. An dieser Stelle möchte ich mich bei Mathias Schrandt herzlich für die ganzen Tipps bedanken, durch ihn konnten wir den Projektbaufehler sehr schnell ausfindig machen.


Regel 14 (Update)

Es ist bemerkenswert, daß nur vielleicht 10% aller Programmierer Programme ohne Verwendung von Flussdiagrammen erfolgreich schreiben können. Unglücklicherweise glauben aber 90%, daß sie der Gruppe dieser 10% angehören. [Rodnay Zaks] ;)


Meldungen

Severity: Warning
Component: Navigation
Category: Application
Source: Reddot.CMS.Rendering.Objects.ContextLoader.GetObject (:0)
Message:
Locals: Project: {GUID}; ProjectVariant: {GUID}; Language(Page): {GUID}; Page(ID/UUID): {ID}; ContentClass: {GUID}; RenderMode: Publish; RequestId: {ID}; 
Parameter null: objectToReflect

Ursache

Es gibt noch einen weiteren Fall, der zu der o.g. Meldung im wsms.log führt. Sobald man eine Masterpage ausserhalb der Navigationsstruktur im Projket verknüpft, dann diese durch den Pagebuilder jagt (Seitenvorschau oder Publizierung) und dazu noch eine solche Abfrage innerhalb der Seite oder in den Navigation-Manager Content-Klassen vorhanden ist:

<%!! Context:CurrentIndex.Page.Headline !!%>

... passiert folgendes. Der Pagebuilder versucht den Index anzusprechen und da dieser, weil sich die Seite nicht innerhalb der Navigationsstruktur befindet, vorhanden ist. Wird, vollkommen korrekt, die Meldung ausgeben: "Ich finde hier leider keinen Index auf den ich mich beziehen kann" => Parameter null: objectToReflect.


Lösung

Die Lösung ist eigentlich recht einfach, es gibt aus meiner Sicht mehrere Möglichkeiten wie man damit umgehen kann:

  1. Man lebt damit, weil man nun weiß warum die Meldung kommt.
  2. Man sorgt dafür, dass die betroffenen Content-Klassen nur noch innerhalb der Navigationsstruktur einsetzbar sind.
  3. Man baut die betroffenen Content-Klassen so um, dass man sie innerhalb und ausserhalb der Navigationsstruktur einsetzen kann.
  4. Man verzichtet auf diese Abfragen innerhalb der Masterpages:
    1. Context:Indexes
    2. Context:CurrentIndex
    3. Context:FirstIndex
    4. Context:LastIndex
  5. Oder man sorgt dafür, dass diese Bereiche nicht ausgeführt werden, wenn die Seite nicht in der Navigationsstruktur befindet.

Weitere Beispiele

die zu der o.g. Meldung führen können:

<%!! Context:Indexes.RootIndexList.[Int:0].Page.GetUrl() !!%>
<reddot:cms>
<htmltext><!-- Resources </htmltext>
    <output type="object" object="Context:Indexes.RootIndexList.[Int:0].Page.Headline" />
    <output type="object" object="Store:Set(Str:GRIndexPage, Context:Indexes.RootIndexList.[Int:0].Page)" />
    <output type="object" object="Store:Set(Str:PageKeywords, <%inf_PageKeywords%>)" />
    <output type="object" object="Store:Set(Str:GRIndexList, Store:Get(Str:GRIndexPage).Elements.GetElement(Str:lst_Resources))" />
    <foreach object="Store:Get(Str:GRIndexList).Value" itemname="item">
        <if>
            <query valuea="Store:item.Elements.GetElement(Str:std_ResourceId).Value" operator="!=" valueb="Escape:EmptyString">
                <output type="object" object="Store:Set(Store:item.Elements.GetElement(Str:std_ResourceId).Value, Store:item.Elements)" />
                <output type="object" object="Str:|" />
                <output type="object" object="Store:item.Elements.GetElement(Str:std_ResourceId).Value" />
                <output type="object" object="Str:|" />
            </query>
        </if>
    </foreach>
<htmltext>Resources --></htmltext>
</reddot:cms>
<reddot:cms>
    <if>                  
        <query valuea="Context:CurrentPage.GetElementByName(Str:opt_ShowMegaMenu).Value" operator="!=" valueb="Str:false">
            <if>                  
                <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id">
                    <htmltext>                      
                        <%!! Navigation:OutputArea(Mainnavigation, Bool:False, Context:CurrentMasterPage.Id) !!%>
                    </htmltext>
                </query>
                <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage.MainLink.OwnerPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id">                    
                    <htmltext>
                        <%!! Navigation:OutputArea(Mainnavigation, Bool:False, Context:CurrentMasterPage.MainLink.OwnerPage.Id) !!%>                            
                    </htmltext>
                </query>
                <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id">                    
                    <htmltext>
                        <%!! Navigation:OutputArea(Mainnavigation, Bool:False, Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.Id) !!%>
                    </htmltext>
                </query>
                <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id">                    
                    <htmltext>
                        <%!! Navigation:OutputArea(Mainnavigation, Bool:False, Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.Id) !!%>
                    </htmltext>
                </query>
                <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id">                    
                    <htmltext>
                        <%!! Navigation:OutputArea(Mainnavigation, Bool:False, Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.Id) !!%>
                    </htmltext>
                </query>
                <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id">                    
                    <htmltext>
                        <%!! Navigation:OutputArea(Mainnavigation, Bool:False, Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.Id) !!%>
                    </htmltext>
                </query>
                <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id">                    
                    <htmltext>
                        <%!! Navigation:OutputArea(Mainnavigation, Bool:False, Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.Id) !!%>
                    </htmltext>
                </query>
            </if>
        </query>
     </if>
</reddot:cms>

Über den Autor:
Thomas Pollinger

... ist Senior Site Reliability Engineer bei der Vodafone GmbH in Düsseldorf. Seit dem Jahr 2007 betreut er zusammen mit seinen Kollegen die OpenText- (vormals RedDot-) Plattform Web Site Management für die deutsche Konzernzentrale.

Er entwickelt Erweiterungen in Form von Plug-Ins und PowerShell Skripten. Seit den Anfängen in 2001 (RedDot CMS 4.0) kennt er sich speziell mit der Arbeitweise und den Funktionen des Management Server aus.