我刚刚为我的新grails项目添加了注册功能.为了测试它,我通过发送电子邮件和密码进行了注册.我使用bcrypt算法对密码进行哈希处理,然后将其保存到数据库中.
但是,当我尝试使用注册时提供的相同电子邮件和密码登录时,登录失败.我调试了应用程序,发现当我尝试与数据库中已经散列的哈希值进行比较时,为同一密码生成的哈希是不同的,因此登录失败(LoginController中的Registration.findByEmailAndPassword(params.email,hashPassd)) .groovy返回null).
这是我的域类Registration.groovy:
class Registration {
transient springSecurityService
String fullName
String password
String email
static constraints = {
fullName(blank:false)
password(blank:false, password:true)
email(blank:false, email:true, unique:true)
}
def beforeInsert = {
encodePassword()
}
protected void encodePassword() {
password = springSecurityService.encodePassword(password)
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的LoginController.groovy:
class LoginController {
/**
* Dependency injection for the springSecurityService.
*/
def springSecurityService
def index = {
if (springSecurityService.isLoggedIn()) {
render(view: "../homepage")
}
else {
render(view: "../index")
}
}
/**
* Show the login page.
*/ …
Run Code Online (Sandbox Code Playgroud) 有没有人幸运使用Java 7运行Grails 1.3.7应用程序?我创建了一个全新的Grails 1.3.7应用程序并尝试在Java 7下运行它.我得到以下错误,但应用程序似乎运行正常.我们有一些1.3.7应用程序,我们不愿意升级到Grails 2.x,所以任何想法都会非常感激.
Unable to use direct char[] access of java.lang.String
java.lang.NoSuchFieldException: count
at java.lang.Class.getDeclaredField(Class.java:1899)
at org.codehaus.groovy.grails.web.util.StringCharArrayAccessor.<clinit>(StringCharArrayAccessor.java:53)
at org.codehaus.groovy.grails.web.util.StreamCharBuffer.readAsString(StreamCharBuffer.java:531)
at org.codehaus.groovy.grails.web.util.StreamCharBuffer.toString(StreamCharBuffer.java:552)
at org.codehaus.groovy.grails.web.pages.FastStringWriter.getValue(FastStringWriter.java:59)
at org.codehaus.groovy.grails.web.pages.FastStringWriter.toString(FastStringWriter.java:55)
at org.codehaus.groovy.grails.web.pages.GroovyPageParser.startTag(GroovyPageParser.java:1119)
at org.codehaus.groovy.grails.web.pages.GroovyPageParser.page(GroovyPageParser.java:801)
at org.codehaus.groovy.grails.web.pages.GroovyPageParser.generateGsp(GroovyPageParser.java:380)
at org.codehaus.groovy.grails.web.pages.GroovyPageParser.parse(GroovyPageParser.java:326)
at org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateEngine.buildPageMetaInfo(GroovyPagesTemplateEngine.java:584)
at org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateEngine.createTemplate(GroovyPagesTemplateEngine.java:493)
at org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateEngine.createTemplateWithResource(GroovyPagesTemplateEngine.java:473)
at org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateEngine.createTemplate(GroovyPagesTemplateEngine.java:246)
at org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateEngine.createTemplateForUri(GroovyPagesTemplateEngine.java:373)
at org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateEngine.createTemplateForUri(GroovyPagesTemplateEngine.java:345)
at org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateEngine.createTemplate(GroovyPagesTemplateEngine.java:262)
at org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.renderWithTemplateEngine(GroovyPageView.java:146)
at org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.renderMergedOutputModel(GroovyPageView.java:81)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
at org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.renderViewForUrlMappingInfo(UrlMappingsFilter.java:260)
at org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal(UrlMappingsFilter.java:189)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.obtainContent(GrailsPageFilter.java:245)
at org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter(GrailsPageFilter.java:134)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter.doFilterInternal(GrailsReloadServletFilter.java:104)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) …
Run Code Online (Sandbox Code Playgroud) 如何将ant脚本转换为gradle脚本?嗨,你能帮我把ant脚本转换成gradle脚本吗?我是gradle的新用户.
<property name="pm-dir" value="${PM-DIR}/${BUILD_NUM}" />
<property name="leis-dir" value="${LEIS_DIR}/${BUILD_NUM}" />
<property name="proxy-name" value="${PROXY_JAR_NAME}"/>
<property name="proxy-client-name" value="${PROXY_CLIENT_JAR_NAME}"/>
<property environment="env"/>
<property name="java-home" value="${env.JAVA_HOME}"/>
<condition property="build-pm">
<equals arg1="True" arg2="${BUILD_PM}" />
</condition>
<condition property="build-LEIS">
<equals arg1="True" arg2="${BUILD_LEIS}" />
</condition>
<target name="build-LEIS-components" if="build-LEIS">
<ant antfile="build.xml"
target="clean"
dir="${leis-dir}/LEIS"
inheritAll="false"/>
<ant antfile="build.xml"
target="ejbdoclet"
dir="${leis-dir}/LEIS/BusinessServices"
inheritAll="false"/>
<ant antfile="build.xml"
target="jar"
dir="${leis-dir}/LEIS"
inheritAll="false"/>
<ant antfile="build.xml"
target="clean"
dir="${leis-dir}/ETS/trunk/Entitlements"
inheritAll="false"/>
<ant antfile="build.xml"
target="build"
dir="${leis-dir}/ETS/trunk/Entitlements"
inheritAll="false"/>
<mkdir dir="${leis-dir}/JARS/APP-INF/lib/"/>
<jar jarfile="${leis-dir}/JARS/APP-INF/lib/LEISConfig.jar">
<fileset dir="LEIS/" includes="datetime.properties"/>
<fileset dir="LEIS/" includes="log4j.properties"/>
<manifest>
<attribute name="Built-By" value="${user.name}"/>
</manifest>
</jar>
</target>
<!--======================================================================== …
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试在grails中为默认约束指定自定义错误消息,但到目前为止我所有回来的都是默认错误消息.
我知道我必须编辑grails-app/i18n/messages.properties文件
如果我更改以下默认错误代码消息,它将正确显示新的错误消息
default.blank.message=Property [{0}] of class [{1}] cannot be blank
Run Code Online (Sandbox Code Playgroud)
但是,这不是我想要做的.我需要更细粒度的错误报告,并且有多个字段可以为空白等.我希望能够做的是,为类中的每个字段显示自定义消息
package com.mycompany.myapp
class Test{
String name
def constraints = {
name(nullable:false, blank:false)
}
}
Run Code Online (Sandbox Code Playgroud)
(以下代码附加到messages.properties的末尾)
test.name.blank=Name cannot be blank
test.name.nullable=Name cannot be nullable
Run Code Online (Sandbox Code Playgroud)
根据grails文档,这应该可以正常工作,无论是否包名 - className.propertyName.blank
grails.org/doc/latest/(约束部分)&(第7.4节 - 验证和国际化)
我已经尝试了所有可以想到的组合,但它总是显示自定义消息
我也尝试过安装grails i18n模板插件
http://www.grails.org/I18n+Templates+Plugin
它会自动为我生成错误代码.我将新的错误代码附加到现有messages.properties文件的末尾,但我仍然收到默认的错误消息.
但是,插件生成的错误代码有所不同.
而不是grails doc - test.name.null = ......中指定的格式,它自动生成test.name.null.error =自定义消息
我还尝试完全删除默认错误消息,但仍然显示它们
如果有人以前遇到过这个问题,我将不胜感激,任何人都可以给予我任何帮助
提前致谢
从grails项目中,我们可以知道使用哪个grails版本.就像我可以获得groovy版本?
当我尝试在Eclipse中安装/导入Grails 3.0.1时,我收到错误消息"指定的目录似乎不是Grails安装".
我已经安装了Groovy Compiler 2.4.3.但仍然得到相同的错误消息.
我如何在Eclipse 4.4中安装Grails 3.0.1?
我有以下安排的课程:
class A {
static belongsTo = [c: C]
B b
}
class B {
static belongsTo = [c: C]
}
class C {
static hasMany = [bbs: B, aas: A]
}
Run Code Online (Sandbox Code Playgroud)
如果我现在创建这些类的实例...
B b = new B()
A a = new A()
a.b = b
C c = new C()
c.addToBbs(b)
c.addToAas(a)
Run Code Online (Sandbox Code Playgroud)
...并尝试保存c ...
c.save()
Run Code Online (Sandbox Code Playgroud)
......我得到了org.hibernate.TransientObjectException Message object references an unsaved transient instance - save the transient instance before flushing: B
.
我认为GORM所做的是首先将保存级联c.aas
,然后它会绊倒a.b
尚未保存的实例.因此例外.
现在 …
<g:each in="${business}" status="i" var="businessInstance">
<tr class="${(i % 2) == 0 ? 'odd' : 'even' }">
<td>${fieldValue(bean: businessInstance, field: "id") }</td>
<td>${businessInstance.id}</td>
</tr>
</g:each>
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,第一和第二表数据都得到相同的值.这两个案件有什么不同吗?
想象一下,我有这样的事情:
def example = {
def temp = ConferenceUser.findAllByUser(User.get(session.user))
[temp: temp]
}
Run Code Online (Sandbox Code Playgroud)
解释我的问题:虽然动态查找器非常易于使用和快速学习,但我必须替换我的网站的动态查找器以进行SQL查询,因为这是一项要求.由于我不太了解SQL,我的主要问题是:
a)我正在使用一个SQLS数据库,配置好驱动程序和数据源,我的网站就像现在一样工作.如果我想为sql语句替换"findAllByUser",我应该这样做:
def dataSource
...
def db = new Sql(dataSource)
def temp = db.rows("SELECT ... ")
Run Code Online (Sandbox Code Playgroud)
b)这会有效吗?我的意思是,如果我使用"findAllByUser",临时对象将是一个列表,我是否需要打开与数据库的连接=?
当页面信息不足时,脚和页脚导航栏之间有一个等待空间:
是否有可能告诉css将页脚放在脚下去除那个空白区域?