[英]Playframework - subpackaged controllers and routing issues
System Details: 系统详情:
Intro 介绍
note: I am new to play framework 注意:我是新玩的框架
I am using the provided "play-starter" project, and with this I have created a controller that routes to various pages. 我正在使用提供的“ play-starter”项目,并以此创建了一个路由到各个页面的控制器。 This worked by using no subpackages. 通过不使用任何子包来工作。
Directory structure: {root}/app/controllers/MyController
目录结构: {root}/app/controllers/MyController
MyController.index()
was displayed with the routing path: MyController.index()
与路由路径一起显示:
GET / controllers.MyController.index
this displayed as expected, also a POST
method I created functioned as expected. 这按预期显示,我创建的POST
方法也按预期运行。
Problem: 问题:
I attempted creating subpackages to start my project, but received errors at every turn (details below). 我尝试创建子包来启动我的项目,但是在任何时候都收到错误消息(详细信息如下)。
Browsing the routing documentation yielded no solution (for me). 浏览路由文档没有解决方案(对我来说)。 I searched for similar issues, found here is a very similar issue, but the answer does not solve my problem. 我搜索了类似的问题,发现这里是一个非常相似的问题,但是答案不能解决我的问题。
A blog seemed to address the issue, which I attempted without success. 一个博客似乎解决了这个问题,但我没有成功。
Error Output: 错误输出:
/usr/lib/jvm/java-8-jdk/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:37417,suspend=y,server=n -Xms512M -Xmx1024M -Xss1M -XX:+CMSClassUnloadingEnabled -Dfile.encoding=UTF-8 -classpath /home/cybex/.IntelliJIdea2017.1/config/plugins/Scala/launcher/sbt-launch.jar:/usr/share/intellij-idea-ultimate-edition/lib/idea_rt.jar xsbt.boot.Boot run
Connected to the target VM, address: '127.0.0.1:37417', transport: 'socket'
[info] Loading global plugins from /home/cybex/.sbt/0.13/plugins
[info] Loading project definition from /home/cybex/Documents/play-project/eatalot/project
[info] Set current project to EatAloT (in build file:/home/cybex/Documents/University/Year%205/WRR301/eatalot/eatalot/)
--- (Running the application, auto-reloading is enabled) ---
[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:8080
(Server started, use Enter to stop and go back to the console...)
[info] Compiling 35 Scala sources and 13 Java sources to /home/cybex/Documents/play-project/eatalot/target/scala-2.12/classes...
[error] /home/cybex/Documents/play-project/eatalot/conf/routes:8: type AccountController is not a member of package controllers.User.routes
[error] GET /user controllers.User.routes.AccountController.index()
[error] /home/cybex/Documents/play-project/eatalot/conf/routes:8: type AccountController is not a member of package controllers.User.routes
[error] GET /user controllers.User.routes.AccountController.index()
[error] /home/cybex/Documents/play-project/eatalot/conf/routes:8: type AccountController is not a member of package controllers.User.routes
[error] GET /user controllers.User.routes.AccountController.index()
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/index.scala.html:28: object AccountController is not a member of package controllers.User.routes
[error] <form action="@controllers.User.routes.AccountController.login()" method="get">
[error] ^
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/index.scala.html:32: object AccountController is not a member of package controllers.User.routes
[error] <form action="@controllers.User.routes.AccountController.register()" method="get">
[error] ^
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/login.scala.html:17: object AccountController is not a member of package controllers.User.routes
[error] <form action="@controllers.User.routes.AccountController.doLogin()" method="post">
[error] ^
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/register.scala.html:16: object AccountController is not a member of package controllers.User.routes
[error] <form method="post" action="@controllers.User.routes.AccountController.doRegister()">
[error] ^
[error] 7 errors found
[error] (compile:compileIncremental) Compilation failed
[info] Compiling 35 Scala sources and 13 Java sources to /home/cybex/Documents/play-project/eatalot/target/scala-2.12/classes...
[error] /home/cybex/Documents/play-project/eatalot/conf/routes:8: type AccountController is not a member of package controllers.User.routes
[error] GET /user controllers.User.routes.AccountController.index()
[error] /home/cybex/Documents/play-project/eatalot/conf/routes:8: type AccountController is not a member of package controllers.User.routes
[error] GET /user controllers.User.routes.AccountController.index()
[error] /home/cybex/Documents/play-project/eatalot/conf/routes:8: type AccountController is not a member of package controllers.User.routes
[error] GET /user controllers.User.routes.AccountController.index()
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/index.scala.html:28: object AccountController is not a member of package controllers.User.routes
[error] <form action="@controllers.User.routes.AccountController.login()" method="get">
[error] ^
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/index.scala.html:32: object AccountController is not a member of package controllers.User.routes
[error] <form action="@controllers.User.routes.AccountController.register()" method="get">
[error] ^
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/login.scala.html:17: object AccountController is not a member of package controllers.User.routes
[error] <form action="@controllers.User.routes.AccountController.doLogin()" method="post">
[error] ^
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/register.scala.html:16: object AccountController is not a member of package controllers.User.routes
[error] <form method="post" action="@controllers.User.routes.AccountController.doRegister()">
[error] ^
[error] 7 errors found
[error] (compile:compileIncremental) Compilation failed
[error] application -
! @74j57k5c0 - Internal server error, for (GET) [/] ->
play.sbt.PlayExceptions$CompilationException: Compilation error[type AccountController is not a member of package controllers.User.routes]
at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27)
at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27)
at scala.Option.map(Option.scala:145)
at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:49)
at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:44)
at scala.Option.map(Option.scala:145)
at play.sbt.run.PlayReload$.taskFailureHandler(PlayReload.scala:44)
at play.sbt.run.PlayReload$.compileFailure(PlayReload.scala:40)
at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17)
at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17)
[info] Compiling 35 Scala sources and 13 Java sources to /home/cybex/Documents/play-project/eatalot/target/scala-2.12/classes...
[error] /home/cybex/Documents/play-project/eatalot/conf/routes:8: type AccountController is not a member of package controllers.User.routes
[error] GET /user controllers.User.routes.AccountController.index()
[error] /home/cybex/Documents/play-project/eatalot/conf/routes:8: type AccountController is not a member of package controllers.User.routes
[error] GET /user controllers.User.routes.AccountController.index()
[error] /home/cybex/Documents/play-project/eatalot/conf/routes:8: type AccountController is not a member of package controllers.User.routes
[error] GET /user controllers.User.routes.AccountController.index()
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/index.scala.html:28: object AccountController is not a member of package controllers.User.routes
[error] <form action="@controllers.User.routes.AccountController.login()" method="get">
[error] ^
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/index.scala.html:32: object AccountController is not a member of package controllers.User.routes
[error] <form action="@controllers.User.routes.AccountController.register()" method="get">
[error] ^
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/login.scala.html:17: object AccountController is not a member of package controllers.User.routes
[error] <form action="@controllers.User.routes.AccountController.doLogin()" method="post">
[error] ^
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/register.scala.html:16: object AccountController is not a member of package controllers.User.routes
[error] <form method="post" action="@controllers.User.routes.AccountController.doRegister()">
[error] ^
[error] 7 errors found
[error] (compile:compileIncremental) Compilation failed
[info] Compiling 35 Scala sources and 13 Java sources to /home/cybex/Documents/play-project/eatalot/target/scala-2.12/classes...
[error] /home/cybex/Documents/play-project/eatalot/conf/routes:8: type AccountController is not a member of package controllers.User.routes
[error] GET /user controllers.User.routes.AccountController.index()
[error] /home/cybex/Documents/play-project/eatalot/conf/routes:8: type AccountController is not a member of package controllers.User.routes
[error] GET /user controllers.User.routes.AccountController.index()
[error] /home/cybex/Documents/play-project/eatalot/conf/routes:8: type AccountController is not a member of package controllers.User.routes
[error] GET /user controllers.User.routes.AccountController.index()
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/index.scala.html:28: object AccountController is not a member of package controllers.User.routes
[error] <form action="@controllers.User.routes.AccountController.login()" method="get">
[error] ^
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/index.scala.html:32: object AccountController is not a member of package controllers.User.routes
[error] <form action="@controllers.User.routes.AccountController.register()" method="get">
[error] ^
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/login.scala.html:17: object AccountController is not a member of package controllers.User.routes
[error] <form action="@controllers.User.routes.AccountController.doLogin()" method="post">
[error] ^
[error] /home/cybex/Documents/play-project/eatalot/app/views/User/Account/register.scala.html:16: object AccountController is not a member of package controllers.User.routes
[error] <form method="post" action="@controllers.User.routes.AccountController.doRegister()">
[error] ^
[error] 7 errors found
[error] (compile:compileIncremental) Compilation failed
Problem details: 问题详细信息:
I created a subpackage User
. 我创建了一个子包User
。 Within this subpackage, I have one controller AccountController
在这个子包中,我有一个控制器AccountController
AccountController
has several functions, I'll use doLogin()
for the purposes of this question AccountController
有几个函数,出于这个问题的目的,我将使用doLogin()
Directory structure: {root}/app/controllers/User/AccountController
目录结构: {root}/app/controllers/User/AccountController
Suggested Solution: 建议的解决方案:
All solutions point to the same code (which results in various errors) 所有解决方案都指向相同的代码(这会导致各种错误)
Each package has its own routes file. 每个程序包都有自己的路由文件。 In my case, I should use controllers.User.routes
followed by the controller name and function for the routes file 就我而言,我应该使用controllers.User.routes
后跟路由文件的控制器名称和功能
eg 例如
POST /user/login controllers.User.routes.AccountController.doLogin()
where the directory layout is controllers/User/AccountController
and using using this for display purposes in a view ( found here ) I use 我的目录布局是controllers/User/AccountController
并用于在视图中显示此视图( 在此处找到 )
<form action="@controllers.User.routes.AccountController.doLogin()" method="post">
BUT this does not work. 但是这不起作用。
Extra Info: 额外信息:
{root}/app/controllers/User/AccountController {root} / app / controllers / User / AccountController
package controllers.User;
import models.User;
import play.Logger;
import play.data.DynamicForm;
import play.data.FormFactory;
import play.mvc.Controller;
import play.mvc.Result;
import views.html.User.Account.*;
import javax.inject.Inject;
import java.util.Random;
import java.util.Set;
public class AccountController extends Controller{
@Inject
FormFactory formFactory;
public Result index() {
//...
}
public Result login(){
//...
}
public Result doLogin(){
//...
}
public Result register(){
//...
}
public Result doRegister(){
//...
}
}
{root}/conf/routes {root} / conf / routes
# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~
# An example controller showing a sample home page
GET / controllers.HomeController.index
GET /user controllers.User.routes.AccountController.index()
GET /user/register controllers.User.routes.AccountController.register()
GET /user/login controllers.User.routes.AccountController.login()
##disable this an you will recieve a 403 forbidden error, the CRSF filter is used for cross site scripting prevention, use for authentication
#+ nocsrf
POST /user/register controllers.User.routes.AccountController.doRegister()
#+ nocsrf
POST /user/login controllers.User.routes.AccountController.doLogin()
# An example controller showing how to use dependency injection
GET /count controllers.CountController.count
# An example controller showing how to write asynchronous code
GET /message controllers.AsyncController.message
# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
{root}/app/views/User/Account/index.scala.html {root} /app/views/User/Account/index.scala.html
@(users: Set[User])
<html>
<header>
<title>All users in list</title>
</header>
<body>
<h1>All users in list</h1>
<br>
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Surname</th>
<th>Cellphone</th>
</tr>
@for(user <- users) {
<tr>
<td>@user.id</td>
<td>@user.name</td>
<td>@user.surname</td>
<td>@user.cellNumber</td>
</tr>
}
</table>
<br>
<br>
<form action="@controllers.User.routes.AccountController.login()" method="get">
<input type="submit" value="Login">
</form>
<br>
<form action="@controllers.User.routes.AccountController.register()" method="get">
<input type="submit" value="Register">
</form>
</body>
</html>
{root}/app/views/User/Account/login.scala.html {root} /app/views/User/Account/login.scala.html
@(message: String)
<html>
<header>
<title>Login Form</title>
</header>
<body>
<h1>Login Form</h1>
<br/>
<label>Email:</label> <input type="email" name="edtEmail"/>
<br/>
<br/>
<label>Password:</label> <input type="password" name="edtPassword"/>
<br/>
<label>@message</label>
<br/>
<form action="@controllers.User.routes.AccountController.doLogin()" method="post">
<input type="submit" value="Login">
</form>
</body>
</html>
Seems to have been some bug, since redoing what I did any previous "tests" to get it working, has proved to resolve the issue. 似乎是一个错误,因为重做了我以前做过的所有“测试”以使其正常运行,事实证明已解决了该问题。
A formal solution for Play 2.6.1
project having a sub package and requiring routing to it: Play 2.6.1
项目的正式解决方案,具有子包并需要路由至该子包:
Subpackage name: User
Subpackage Controller: AccountController
子软件包名称: User
软件包控制器: AccountController
Project App Directory Structure: 项目应用目录结构:
app/
controllers/ (provided)
filters/ (provided)
models/
services/ (provided)
views/ (provided)
Controllers Directory 控制器目录
controllers/
User/ (sub package)
AccountController.java
HomeController.java (provided)
Account controller contains methods: 帐户控制器包含以下方法:
Views Directory 视图目录
views/
User/
Account/
index.scala.html
register.scala.html
index.scala.html (provided)
Note: try to keep the same directory structure (see User/Account/{controller function name}
) 注意:尝试保持相同的目录结构(请参阅User/Account/{controller function name}
)
Routing file entry conf/routes
: 路由文件输入conf/routes
:
GET /user controllers.User.AccountController.index
GET /user/register controllers.User.AccountController.register()
#disable this (below) and you will receive a 403 forbidden error, the CRSF filter is used for cross site scripting prevention, use for authentication.
#You can apply this autentication: see https://stackoverflow.com/questions/45017920/post-method-rendering-403-forbidden-page-instead-of-executing-post-method-code
#+ nocsrf
POST /user/register controllers.User.AccountController.doRegister()
Hopes this helps! 希望这会有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.