play framework 2.1.3 extend play.api.templates.Html

Просто се чудя дали е възможно и ако да колко трудно е да се разшири класът play.api.templates.Html.

import java.lang.StringBuilder;

public class MyHtml extends play.api.templates.Html {

}

дава ми грешката:

error: constructor Html in class Html cannot be applied to given types;

това дава същото:

public class MyHtml extends play.api.templates.Html {
    String text;

    public MyHtml(String text) {
        this.text = text;
    }
}

Благодаря ти


person Trevor Donahue    schedule 20.10.2013    source източник


Отговори (1)


play.api.templates.Html е написано в Scala не Java, така че използва не java.lang.StringBuilder, а scala.collection.mutable.StringBuilder.

Това компилира (не казвам, че е полезно или дори добра практика):

package views;

public class MyHtml extends play.api.templates.Html {
    private String text;

    public MyHtml(String text) {//please take care of HTML injection!!!
        super(scala.collection.mutable.StringBuilder$.MODULE$.newBuilder());
        this.text = text;
    }

    @Override
    public String body() {
        return text;
    }
}
person Schleichardt    schedule 20.10.2013
comment
благодаря, компилира се. Но причината, поради която исках да направя това, е да извикам MyHtml от контролера така: views.MyHtml.user.read.render( ... изпълнимо ли е? - person Trevor Donahue; 21.10.2013
comment
Истинските шаблони на Scala предоставят метода „render“ за Java API за генериране на екземпляр на HTML. MyHtml вече е от типа 'Html', така че бихте го използвали като 'return ok(new views.MyHtml(foo));'. Не е добра идея да губите шаблоните на Scala, те са безопасни за типове и ви защитават при много проблеми със сигурността. - person Schleichardt; 21.10.2013
comment
return ok(new views.MyHtml("foo")); Това не работи. страницата е празна. - person Trevor Donahue; 21.10.2013
comment
Също така актуализирах отговора си, когато написах коментара си. Заменям метода body(), - person Schleichardt; 21.10.2013