我正在使用 Play 2.1.2,我想使用动态表单。我在我自己的小 hello world 项目中尝试过,一切正常,但是当我在其他更大的项目中使用表单时,我遇到了异常。这是我的代码(在两个项目中是相同的):
Controller
public static Result signInForm() {
DynamicForm form = Form.form().bindFromRequest(); //exception on this line
return renderJapid(form);
}
路线
GET /sign-in controllers.Authentication.signInForm()
当我转到 localhost:9000/sign-in 时,我得到了这个异常:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class play.data.format.Formatters
at play.data.Form.bind(Form.java:320) ~[play-java_2.10.jar:2.1.2]
at play.data.DynamicForm.bind(DynamicForm.java:100) ~[play-java_2.10.jar:2.1.2]
at play.data.DynamicForm.bindFromRequest(DynamicForm.java:71) ~[play-java_2.10.jar:2.1.2]
at controllers.Authentication.signInForm(Authentication.java:310) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$19$$anonfun$apply$19.apply(routes_routing.scala:305) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$19$$anonfun$apply$19.apply(routes_routing.scala:305) ~[na:na]
拜托,你能帮帮我吗?问题出在哪里?我检查了两个项目中的 Global.java 和 application.conf,但没有发现任何可能导致此问题的原因。
更新:
我试过把这段代码放在
FormattingConversionService fcs = Formatters.conversion;
在动态表单调用行之前。在浏览器中重新加载 localhost:9000/sign-in 后,我在新行中遇到了这个异常:
Caused by: java.lang.NullPointerException: null
at play.data.format.Formatters.register(Formatters.java:186) ~[play-java_2.10.jar:2.1.2]
at play.data.format.Formatters.<clinit>(Formatters.java:100) ~[play-java_2.10.jar:2.1.2]
at controllers.Authentication.signInForm(Authentication.java:310) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$19$$anonfun$apply$19.apply(routes_routing.scala:305) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$19$$anonfun$apply$19.apply(routes_routing.scala:305) ~[na:na]
at play.core.Router$HandlerInvoker$$anon$6$$anon$2.invocation(Router.scala:175) ~[play_2.10.jar:2.1.2]
所以看起来 Formatters 在类路径中。但是当我再次点击浏览器中的重新加载按钮时,我得到了与以前相同的 NoClassDefFoundError(这次是在我添加的行上)。
最佳答案
NoClassDefFoundError 通常表示该类不在类路径中。可能在您编译它时它就在那里,但现在它不见了(主要是在共享库中看到的)。
NoClassDefFoundError documentation
看起来它可能没有找到 play-java_2.10.jar。
编辑:(总结评论)
Play jar 使用 Spring 来绑定(bind)数据。最初的想法是 Spring 没有包含在类路径中,但它确实是。但是,类路径上的 Spring 似乎与 lib 文件夹中的某些 Spring jar 有冲突。删除 lib 文件夹中的 jars 似乎已经清除了错误。 :)
关于java.lang.NoClassDefFoundError : Could not initialize class play. 数据.format.Formatters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18498817/