Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Play Framework 2.2.1 - Compilation error: "method render in class index cannot be applied to given types;"

I am new to Play Framework, and attempting to build a Todo-list from this manual.

When I try to run the application I get the error:

Compilation Error
error: method render in class index cannot be applied to given types;

My code is (the relevant parts):

MainController.java:

final static Form<Task> taskForm = Form.form(Task.class);

public static Result tasks() {
    return ok(
            views.html.index.render(Task.all(), taskForm)
    );
}

index.sacala.html:

@(tasks: List[Models.Task], taskForm: Form[Models.Task])

I looked around, the closest thread I found was this one, but I was not able to resolve the issue using it (might be due to lack of understanding of the environment / framework...).

One last thing that is worth mentioning:
If I change 'index.sacala.html' to be parameter-less (and change the 'MainController' accordingly, everything works perfectly.

Would appreciate any thoughts about resolving this compilation error.

EDIT:
The Task.all() code is:

public static List<Task> all() {
    return new ArrayList<Task>();
}
like image 866
Avi Turner Avatar asked Feb 24 '14 16:02

Avi Turner


3 Answers

Most probably your package is models NOT Models isn't it?

BTW this package is autoimported so you can just use:

 @(tasks: List[Task], taskForm: Form[Task])

Hm, changes... Actually log in the console says everything

[error] /www/play20apps/testing/Todo-List/app/controllers/MainController.java:24: error: method render in class index cannot be applied to given types;
[error]         return ok(views.html.index.render(Task.all(), taskForm));
[error]                                   ^
[error]   required: List<Task>,play.api.data.Form<Task>
[error]   found: List<Task>,play.data.Form<Task>
[error]   reason: actual argument play.data.Form<Task> cannot be converted to play.api.data.Form<Task> by method invocation conversion
[error] 1 error

especially these lines:

[error]   required: List<Task>,play.api.data.Form<Task>
[error]   found: List<Task>,play.data.Form<Task>

TBH I didn't ever test the Activator but it looks that imports play.api.data.Form into views, which is incorrect for Java controllers. solution is full qualified path for Form:

@(tasks: java.util.List[Task], taskForm: play.data.Form[Task])

As mentioned in comment *.api.* imports are for Scala and normal are for Java, that's the rule of the thumb in Play 2.+

PostScriptum: Just realized that in your build.sbt you have play.Project.playScalaSettings and actually it should be play.Project.playJavaSettings, this change fixes your problems with Activator.

like image 185
biesior Avatar answered Sep 23 '22 08:09

biesior


It looks like Task.all() returns a Java list, while the scala template is probably expecting a Scala list.

I woul suggest changing the return type of Task.all() if possible, or fully qualified the definition in the template:

@(tasks: java.util.List[Models.Task], taskForm: Form[Models.Task])
like image 38
vptheron Avatar answered Sep 20 '22 08:09

vptheron


Although biesior's answer has some nice insights and tips, it did not solve the issue.
At the end I have abndoned type TypeSafe Activator and created the site from scratch using play comamnd line and it worked perfectly.

I never found the origin of the issue in the question, I am leaving this answer for a future reference for the googlers.

If any one has a better solution, please leave your answer and if it works I will mark it as accepted.


EDIT:

@biesior was kind enough to go through my code and he did find the issue. If you have the same issue, take a look at his answer.

like image 39
Avi Turner Avatar answered Sep 20 '22 08:09

Avi Turner