Grails服务->;java.lang.NullPointerException:无法对null对象调用方法serviceMethod()
我有src/groovy类。我想在这里使用我的服务。但出现错误“没有绑定到线程的Hibernate会话,配置不允许在此创建非事务会话”。我试图调试,但无法找到。你能帮我找出我的错误吗Grails服务->;java.lang.NullPointerException:无法对null对象调用方法serviceMethod(),grails,Grails,我有src/groovy类。我想在这里使用我的服务。但出现错误“没有绑定到线程的Hibernate会话,配置不允许在此创建非事务会话”。我试图调试,但无法找到。你能帮我找出我的错误吗 class ListenerSession implements HttpSessionListener { def transactionService = new TransactionService () public ListenerSession() { } public
class ListenerSession implements HttpSessionListener {
def transactionService = new TransactionService ()
public ListenerSession() {
}
public void sessionCreated(HttpSessionEvent sessionEvent){
}
public void sessionDestroyed(HttpSessionEvent sessionEvent) {
HttpSession session = sessionEvent.getSession();
User user=session["user"]
if(user){
try{
java.util.Date date = session['loginDate']
transactionService.updateUserLastLogin(user,date)
-----}catch (Exception e) {
println e
}
服务代码为:
def updateUserLastLogin(User user,Date date){
try{
User.withTransaction{
println "121212"
user.lastLogin=date
user.loginDuration=new Date().time - user?.lastLogin?.time
def x=user.save()
}
}catch (Exception e) {
println e
}
}
不要用
new
实例化服务。如果他们几乎使用任何一块Grails框架,那么这一块都不会像本例中的GORM会话那样工作
这正是你的问题:
用伯特的回答:
ApplicationContext ctx = (ApplicationContext)ServletContextHolder.
getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
transactionService = (TransactionService) ctx.getBean("transactionService")
不要用
new
实例化服务。如果他们几乎使用任何一块Grails框架,那么这一块都不会像本例中的GORM会话那样工作
这正是你的问题:
用伯特的回答:
ApplicationContext ctx = (ApplicationContext)ServletContextHolder.
getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
transactionService = (TransactionService) ctx.getBean("transactionService")
Grails不会在src/groovy级别为您注入服务,而仅仅声明一个新的
TransactionService
实例并不会给您带来所有好处(因此您的错误)。您需要从spring上下文中获取实例,如下所示
import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA
class ListenerSession implements HttpSessionListener {
public ListenerSession() {
}
public void sessionCreated(HttpSessionEvent sessionEvent){
}
public void sessionDestroyed(HttpSessionEvent sessionEvent) {
HttpSession session = sessionEvent.getSession();
User user=session["user"]
if(user){
try{
java.util.Date date = session['loginDate']
def ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT)
def transactionService = ctx.transactionService
transactionService.updateUserLastLogin(user,date)
}catch (Exception e) {
println e
}
}
}
}
Grails不会在src/groovy级别为您注入服务,而仅仅声明一个新的
TransactionService
实例并不会给您带来所有好处(因此您的错误)。您需要从spring上下文中获取实例,如下所示
import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA
class ListenerSession implements HttpSessionListener {
public ListenerSession() {
}
public void sessionCreated(HttpSessionEvent sessionEvent){
}
public void sessionDestroyed(HttpSessionEvent sessionEvent) {
HttpSession session = sessionEvent.getSession();
User user=session["user"]
if(user){
try{
java.util.Date date = session['loginDate']
def ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT)
def transactionService = ctx.transactionService
transactionService.updateUserLastLogin(user,date)
}catch (Exception e) {
println e
}
}
}
}
您应该考虑将代码写入“代码块”,以便更好地阅读。您是否已将侦听器添加到
web.xml
文件中?此外,这应该给你一些建议:你应该考虑把你的代码写入一个“代码块”,以便更好地阅读…您是否已将侦听器添加到web.xml
文件中?此外,这应该给你一些建议: