2012-09-09 1 views
1

이 오류 메시지는 이미 최대 절전 모드 컨텍스트에서 여러 번 게시되었습니다.Grails는 "예외 발생 후 세션을 플러시하지 않음"오류 메시지

Grails의 서비스와, 어떤 도움이 정말로 이해할 수있을 것이다 도메인 클래스를 사용하는 동안이 오류가 무엇입니까

도메인 클래스

class Coupon { 
    Date dateCreated 
    Date lastUpdated 
    String code 
    String email 
    String address 
    String state 
    String city 
    String zip 
    def couponCodeGeneratorService 

    def beforeValidate() { 
     println code+"---------8-" 
     code = couponCodeGeneratorService.generate() 
     println code+"----------" 
    } 
    static constraints = { 
     email blank:false,email:true 
     address blank:false 
     state blank:false 
     city blank:false 
     zip blank:false 
    } 
} 

서비스

class CouponCodeGeneratorService { 
    Random randomGenerator = new Random() 
    def serviceMethod() { 

    } 
    def generate(){ 
     def group1 = randomGenerator.nextInt(9999)+""; 
     def group2 = randomGenerator.nextInt(9999)+""; 
     def group3 = randomGenerator.nextInt(9999)+""; 
     def group4 = randomGenerator.nextInt(9999)+""; 
     return group1.padLeft(4,"0") +group2.padLeft(4,"0")+group3.padLeft(4,"0")+group4.padLeft(4,"0") 
    } 
} 

내가 점점 오전 오류 is

---------8- 
4844634041715590---------- 
4844634041715590---------8- 
| Error 2012-09-10 11:32:54,938 [http-bio-8080-exec-7] ERROR hibernate.AssertionFailure - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session) 
Message: null id in com.easytha.Coupon entry (don't flush the Session after an exception occurs) 
    Line | Method 
->> 19 | beforeValidate  in com.easytha.Coupon 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 46 | onApplicationEvent in org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener 
| 24 | save . . . . . . . in com.easytha.CouponController 
| 186 | doFilter   in grails.plugin.cache.web.filter.PageFragmentCachingFilter 
| 63 | doFilter . . . . . in grails.plugin.cache.web.filter.AbstractFilter 
| 886 | runTask   in java.util.concurrent.ThreadPoolExecutor$Worker 
| 908 | run . . . . . . . in  '' 
^ 662 | run    in java.lang.Thread 
| Error 2012-09-10 11:32:54,944 [http-bio-8080-exec-7] ERROR errors.GrailsExceptionResolver - AssertionFailure occurred when processing request: [POST] /EasyTha/coupon/save - parameters: 
zip: asdf 
address: asd 
email: [email protected] 
state: asd 
code: 
create: Create 
city: asdf 
null id in com.easytha.Coupon entry (don't flush the Session after an exception occurs). Stacktrace follows: 
Message: null id in com.easytha.Coupon entry (don't flush the Session after an exception occurs) 
    Line | Method 
->> 19 | beforeValidate  in com.easytha.Coupon 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 46 | onApplicationEvent in org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener 
| 24 | save . . . . . . . in com.easytha.CouponController 
| 186 | doFilter   in grails.plugin.cache.web.filter.PageFragmentCachingFilter 
| 63 | doFilter . . . . . in grails.plugin.cache.web.filter.AbstractFilter 
| 886 | runTask   in java.util.concurrent.ThreadPoolExecutor$Worker 
| 908 | run . . . . . . . in  '' 
^ 662 | run    in java.lang.Thread 

나는 Hibernate에 익숙하지 않다. 또한 이것은 신용 카드 번호처럼 보이는 쿠폰 코드를 만드는 올바른 방법 일까?

+0

이 소리를가 검증에 실패 할 수 또는 서비스가 예외 있지만 도메인은 여전히) (저장 호출하려고에 저장 호출하는 코드를 던졌습니다처럼, 수 너는 그걸 확인해 볼까? – Steve

+0

@steve 컨트롤러에는 'scaffold = true'주석 만 있습니다. 서비스 메소드에서 catch catch를 추가했는데 이제는 예외가 약간 다르게 보입니다. 이제 콘솔은 service 메소드를 호출하기 전후에 디버그 메시지를 인쇄합니다. 업데이트 된 예외 – Sap

+1

을 보시기 바랍니다. 'code'가 비어 있고 유효하지 않은 유효성 검증이되어서는 안되며 오류가 나타나는 이유는 아닙니다. 다시 돌아가서 'code'값을 하드 코드 할 수 있습니까? beforeValidate() ... 죄송합니다. 오해의 소지가 있다면이 시점에서 약간의 추측입니다 – Steve

답변

6

CouponCodeGeneratorService이 트랜잭션 일 수 있다고 생각됩니다. 따라서 서비스 메서드를 beforeValidate 내부에서 호출하면 메서드 내에서 데이터베이스를 건드리지 않아도 트랜잭션을 열고 닫을 수 있습니다.이 중 다른 작업으로 인해 세션이 다시 플러시됩니다.

서비스 비 트랜잭션 만들어보십시오 :

static transactional = false 
+0

좋은 하나. 어쨌든 서비스 내부에이 방법을 사용한다는 요지는 없습니까? 정적 인 Util 클래스 나 Mixin에서 더 깨끗한가? – Steve