我正在使用Grails in Action中的一个示例,特别是第一次实现服务并将工作从Controller转移到服务。
我有一个包含用户和字符串内容的Post对象。
服务代码是
class PostService {
boolean transactional= true
Post createPost(String user, String content){
def thisUser = User.findByUserID(user)
if (user){
def post = new Post(content:content)
if (user.save()){
return post
} else
throw new PostException(message: "Invalid post", post:post)
}
throw new PostException(message:"Invalid User ID")
}
}
,控制器代码为
def addPost = {
try{
def newPost = postService.createPost(params.id, params.content)
flash.message= "Added new Post: $newPost.content}"
} catch (PostException pe){
flash.message = pe.message
}
redirect(action:'timeline', id:params.id)
}
此代码的工作方式是在表单中输入,作为params对象传递给addPost
。然后将所述params对象移交给服务,在该服务中将创建一个新邮件并绑定给用户。
但是,我在user.save()
收到错误。具体的错误信息是
No signature of method: java.lang.String.save() is applicable for argument
types: () values: []
如果我擦除服务连接器并在控制器中实现服务代码
def user = User.findByUserID(params.id)
if (user) {
def post= new Post(params)
user.addToPosts(post)
if (user.save()){
flash.message= "Sucessfully created Post"
}
else {
user.discard()
flash.message = "Invalid or empty post"
}
} else {
flash.message = "Invalid User ID"
}
redirect(action: 'timeline', id:params.id)
}
行动有效。那么为什么我在服务实现上遇到user.save()
错误,而不是控制器?
答案 0 :(得分:1)
user
是您传递给服务方法的String。 thisUser
是您获得的实际用户对象,您可以调用save()
。