在我的Grails应用程序注册后,用户会收到一封带有确认链接的电子邮件。点击该链接,将她带到相应的“启用”操作。
这完美无瑕。但是,现在似乎存在一个非常特殊的令牌错误,该令牌未能通过此片段的user.save():
assert !user.isDirty() // assertion is ok
user.enabled = true
user.confirmationToken = null
assert user.isDirty() // assertion is ok
if (user.save()) { // FAILS WITH ERROR BELOW
// ...
}
堆栈跟踪:
[ 16.09.2011 11:57:47.591] [http-bio-localhost/127.0.0.1-8080-exec-3]
ERROR
org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver
org.apache.commons.logging.impl.SLF4JLog
Exception occurred when processing request: [GET] /user/enable/bc73701c-d280-4de0-8951-7af9f2a3d636
Stacktrace follows:
org.postgresql.util.PSQLException: No value specified for parameter 1.
at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:178)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:246)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at myproj.UserService.enableUser(UserService.groovy:234)
at myproj.UserController$_closure8.doCall(UserController.groovy:244)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
请注意,我可以在同一个正在运行的实例中创建其他用户 - 但错误(到目前为止)只发生在该代码中。
有关如何解决问题的任何想法?
正在使用的版本:
(由于这些部分的开发版本,它可能是一个错误,但我不确定。)
答案 0 :(得分:2)
正如前面提到的JIRA issue所述,问题源于为映射类设置的唯一约束。
将唯一约束转移到Mapping DC解决了这个问题。
答案 1 :(得分:0)
它确实看起来像一个bug。不知何故,底层SQL PreparedStatement上的参数没有设置。 Grails / GORM应该这样做。您是否能够在更稳定版本的Grails和/或JDBC驱动程序上运行您的应用程序?它可能会帮助您排除故障,并为您提供打开错误报告的详细信息。
编辑:我刚发生了另一种可能性。也许你的某个类型不匹配,比如试图进入INTEGER列的String值?驱动程序可能将“坏数据”解释为“无数据”。在你走得太远之前,只是在黑暗中拍摄。