我有一个GSP页面:
<g:if test="freelancer">
<g:each in="${ freelancer }" var="freelance">
<a href="${ createLink(controller:'user', action:'homepage', id:freelance.user.username) }">${ freelance.firstName }</a>
</g:each>
</g:if>
并采取行动:
def homepage() {
println(params.id)
def user = User.find{
username == params.id
}
if(user){
println(user.username + "!")
return[user:user]
}
}
和欢迎页面:
<body>
Welcome ${ user.username }
</body>
在第一个GSP页面中,我获得firstName链接,当我点击它查看他的主页时,我收到一个错误:
Cannot get property 'username' on null object
但是在我的IDE控制台中,println(params.id)
打印一个用户名,但是用方括号输出。我的代码出了什么问题?
答案 0 :(得分:1)
在“首页”操作中尝试
def user = User.find{ it.username == params.id }
而不是
def user = User.find{ username == params.id }
答案 1 :(得分:0)
这是我的用户域类:
class User {
String username
String passwordHash
byte[] passwordSalt
Profile profile
static hasMany = [ roles: Role, permissions: String ]
static constraints = {
profile(nullable:false)
username(nullable: false, blank: false, unique: true, size:3..15)
passwordHash(nullable:false, blank:false, minSize:6)
}
static mapping = {
profile lazy:false
}
在g:if标签中,我将自由职业者放在括号中并更改为User.findByUsername()
。但是也有同样的错误。我不希望params.id作为列表。
答案 2 :(得分:0)
是的,您必须在标记中使用括号。这是第一。
<g:if test="${freelancer}">
</g:if>
否则, groovy truth 将始终将非空字符串评估为true,因此您的测试将存在缺陷。
另外,我会使用g:link而不是html&#39; a&#39;标签
<g:each in="${ freelancer }" var="freelance">
<g:link controller='user', action='homepage', id="${freelance.user.username}">
${freelance.firstName}
</g:link>
</g:each>
作为建议,考虑使用User.findByUsername()而不是find闭包。
如果有效,请告诉我们。 ;)