如何在grails中记录运行时错误
我试图调试保存域对象的一个简单问题如何在grails中记录运行时错误,grails,log4j,Grails,Log4j,我试图调试保存域对象的一个简单问题 class AppRideOfferController { def index() {} def create() { if(params.fromAddr && params.toAddr && params.preferences && params.startDate) { RideOffer rideOffer = new RideOffer(st
class AppRideOfferController {
def index() {}
def create() {
if(params.fromAddr && params.toAddr && params.preferences && params.startDate) {
RideOffer rideOffer = new RideOffer(startLocation: params.fromAddr, endLocation: params.toAddr, startDateTime: new Date(Integer.parseInt((String) params.startDate)));
rideOffer.save(flush: true);
//assert(rideOffer.id);
log.info("blah");
render(contentType:"text/json") {
result(blah: rideOffer)
};
}
}
}
在上面的代码中,我只是创建一个域对象,保存它,并将其作为json返回,其中包含生成的id。但是,如果我取消对asset语句的注释,它将失败,因为未设置id
我在控制台上没有收到任何错误,因此我想知道如何将运行时错误堆栈跟踪记录到标准输出上?我的Config.groovy的log4j配置如下所示:
log4j = {
// Example of changing the log pattern for the default console appender:
//
appenders {
console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
}
info 'grails.app.controllers',
'grails.app.controller',
'grails.app';
error 'org.codehaus.groovy.grails.web.servlet', // controllers
'org.codehaus.groovy.grails.web.pages', // GSP
'org.codehaus.groovy.grails.web.sitemesh', // layouts
'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
'org.codehaus.groovy.grails.web.mapping', // URL mapping
'org.codehaus.groovy.grails.commons', // core / classloading
'org.codehaus.groovy.grails.plugins', // plugins
'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
'org.springframework',
'org.hibernate',
'net.sf.ehcache.hibernate'
}
如果代码生成运行时错误,您将看到
error.gsp
视图。在文档中,您可以看到save()
不会产生异常,但会填充域类验证中可能发生的错误。如果您将看到如何处理save方法中的错误
比如:
def save() {
if(!instance.save(flush:true)) {
//instance fails in validation, you need to respond those errors
Locale locale = RequestContextUtils.getLocale(request) //Locale of the user
render([success: false, errors: errorsToMap(instance.errors, locale)]) as JSON
} else {
render([success: true, record: instance]) as JSON
}
}
//just a helper to format the errors output
private List<Map> errorsToMap(Errors errors, Locale locale) {
def error = []
for(def err : errors.allErrors) {
if(err instanceof FieldError) {
error << [id: err.field, msg: Holders.grailsApplication.mainContext.getMessage(err, locale)]
}
}
return error
}
def save(){
如果(!instance.save(flush:true)){
//实例验证失败,您需要响应这些错误
Locale Locale=RequestContextUtils.getLocale(request)//用户的语言环境
将([success:false,errors:errorToMap(instance.errors,locale)])呈现为JSON
}否则{
将([success:true,record:instance])呈现为JSON
}
}
//只是一个帮助器来格式化错误输出
私有列表错误映射(错误、区域设置){
def错误=[]
for(def err:errors.allErrors){
if(err instanceof FieldError){
错误尝试替换rideOffer.save(刷新:true);替换为rideOffer.save(刷新:true,失败者错误:true);并且您应该在控制台中看到错误域类是什么样子的?您是否在映射中特别提到了要分配的生成器
?在处理用户提供的参数时,不要使用failOnError:true
-对此类非异常情况使用异常(你应该总是期望用户犯错误或试图入侵你的网站)是错误的,而且代价相当昂贵。