2009-06-19 7 views
3

Ich bin gerade mit Lift und Scala und habe ein Problem, das ich nicht wirklich verstehe.Lift-Snippet: Präfix nicht an einen Namensraum gebunden

Ich habe die Folowing index.html

<html> 
<head><title>title</title></head> 
<body> 
    <table> 
     <lift:Members.list> 
      <tr> 
       <td><m:nick/></td> 
      </tr> 
     </lift:Members.list> 
    </table> 
</body> 
</html> 

und das folgende Snippet:

class Members { 
    def list(xhtml: NodeSeq) = 
    Member.findAll.flatMap(member => bind("m",xhtml 
             ,"nick" -> member.nickName 
    )) 
} 

aus irgendeinem Grund ich die folgende Fehlermeldung erhalten. Ich habe viel versucht, aber ich kann es nicht zum Laufen bringen. Was ist los mit dir?

XML Parsing Error: prefix not bound to a namespace 
Location: http://localhost:8080/hazardlift-1.0-SNAPSHOT/ 
Line Number 8, Column 25:<td><m:nick></m:nick></td> 
-----------------------------^ 

Antwort

4

Vielleicht Lift bekommt nicht, wie Sie Ihren Rückgabewert behandeln. Erzwingen Sie eine implizite Konvertierung in NodeSeq, indem Sie sie als returntype angeben.

.... 
def list(xhtml: NodeSeq) : NodeSeq = 
.... 
+0

Das hat funktioniert, vielen Dank. Wie könnte man das auf eine gute Weise entdecken? Der Fehler war nicht wirklich hilfreich ... –

+0

Eine Ausnahme sollte Sie zum Protokoll führen. Sie werden wahrscheinlich in Ihrem Protokoll sehen, dass ein Fehler beim Abgleich des Snippets aufgetreten ist. Es ist Standard, dass Snippets Rückgabetypen benötigen, sodass Sie aufgefordert werden sollten, die Typensignatur in Ihrer Snippet Delcaration zu überprüfen. – Joe

0

Ich habe gerade eine andere Ursache für diesen Fehler - einen ungelösten Tag.

ich HTML hatte:

<div > 
    <h3>Request Information</h3> 

    <lift:DetailedRequestData.renderContent> 
     <f:rowTag></f:rowTag> 
    </lift:DetailedRequestData.renderContent> 
</div> 

ich dies für renderContent geschrieben hatte:

def renderContent(ns: NodeSeq): NodeSeq = { 
    val key = beginTrans(DisplayData.logger) 
    var result = ns 

    try { 
    var requestID = DisplayData.getParameter("request") 
    bind("f", ns, "rowTag" -> <p>Request ID: {requestID}</p>) 
    } 
    catch { 
    case t: Throwable => DisplayData.logger.error("[DetailedRequestData$.renderContent] ", t) 
    } 

    endTrans(DisplayData.logger, key) 
    result 
} 

Da ich das Ergebnis der bind-result nicht belegt hatte, war ich das nicht modifizierte NodeSeq Rückkehr und bekam den gleichen prefix not bound to a namespace Fehler. Ändern die eine Aussage zu:

result = bind("f", ns, "rowTag" -> <p>Request ID: {requestID}</p>) 

Ja, das ist meine eigenen dummen Fehler war, aber das Problem hier zu dokumentieren, hoffentlich werde ich jemand anderes aus, die das gleiche Problem sparen und nicht zu wissen, warum.