2012-01-17 19 views
2

例外:は、フローの実行をシリアル化できませんでした

Error 500: Could not serialize flow execution; make sure all objects stored in 
      flow or flash scope are serializable 
Servlet: grails 
URI: /payment.com/grails/payment/makePayment.dispatch 
Exception Message: payment.com.ValidationService$$EnhancerByCGLIB$$d0f2434f 
Caused by: Could not serialize flow execution; make sure all objects stored in 
      flow or flash scope are serializable 
Class: Unknown 
At Line: [-1] 
Code Snippet: 

ディスカッション:

payment.com: project name   
payment: is the name of (domain, view, controller) 
makePayment: is a webflow to make payment 
ValidationService: is a service to test if credit card is valid or not 

問題:
私は私のGrailsプロジェクト

i have a grails webflow that makes a payment, in this webflow i use grails 
command object to validate input values. 
when i call the method isValid from Validation service i got this error 
中で、このエラーを得ました

注:

i try to serialize domain class, controller, service, & command object class, 
but i couldn't solve this issue. 

任意のヘルプ、感謝

編集:

検証サービス

package payment.com 

import java.io.Serializable; 

class ValidationService implements Serializable{ 

// Filter out non-digit characters 
def getDigitsOnly (String s) { 
    StringBuffer digitsOnly = new StringBuffer(); 
    char c; 
    for (int i = 0; i < s.length(); i++) { 
    c = s.charAt (i); 
    if (Character.isDigit (c)) digitsOnly.append (c); 
    } 
    return digitsOnly.toString(); 
} 

// Perform Luhn check 
def isValid (String cardNumber) { 
    String digitsOnly = getDigitsOnly (cardNumber); 
    int sum = 0; 
    int digit = 0; 
    int addend = 0; 
    boolean timesTwo = false; 

    for (int i = digitsOnly.length() - 1; i >= 0; i--) { 
    digit = Integer.parseInt (digitsOnly.substring (i, i + 1)); 
    if (timesTwo){ 
     addend = digit * 2; 
     if (addend > 9) addend -= 9; 
    }else{ 
     addend = digit; 
    } 
    sum += addend; 
    timesTwo = !timesTwo; 
    } 
    int modulus = sum % 10; 

    if (modulus == 0){ 
     return true 
    }else{ 
    return false 
    } 
} 
} 

MakePaymentS

package payment.com 

import org.codehaus.groovy.grails.validation.Validateable; 
import java.io.Serializable; 
import payment.com.ValidationService; 

@Validateable 
class MakePaymentStep1Command implements Serializable{ 
ValidationService ValidationService 
String cardNumber 

static constraints ={ 
    cardNumber(blank:false, size:11..16, validator:{ val, obj-> 
     if (!obj.ValidationService.isValid(val)){ 
      return ['payment.cardNumber.invalid'] 
     } 
     return true; 
    }) 
} 
} 

支払コントローラ

class PaymentController{ 
.... 
.... 
def MakePaymentFlow = { 
.... 
    Step1{ 
     on('submit').to('Step1Submit') 
    } 
    Step1Submit{ 
     action {MakePaymentStep1Command cmd -> 
      flow.step1Bean = cmd 
      if (!flow.step1Bean.validate()){ 
       error() 
      } 
     } 
     on('error').to('Step1') 
     on('success'){ 
      flow.message = null 
     }.to('Step2') 
    } 


.... 
} 


} 

は、エラーがここで起こるtep1Command:

if (!flow.step1Bean.validate()){ 
    error() 
} 

答えて

1

あなたのgrails projectには(src/groovy)というディレクトリがあります。あなたのvalidation Service classは、このディレクトリの下に置くと、あなたのmakepaymentStepCommandはようになります:私は私の質問を更新

MakePaymentStep1Command

package payment.com 

import java.io.Serializable; 
import payment.com.Validation; 

class MakePaymentStep1Command implements Serializable{ 
Validation validation 
String cardNumber 

static constraints ={ 
    cardNumber(blank:false, size:11..16, validator:{ val, obj-> 
     if (!obj.validation.isValid(val)){ 
      return ['payment.cardNumber.invalid'] 
     } 
     return true; 
    }) 
} 
} 

I am not sure if this works, but try it.

+0

をご覧ください。 サービスを利用する必要があります。 サービスを使用する方法がわかっている場合は、 に感謝します。mbayloon –

0

Lokingを例外メッセージでValidationServiceはシリアライズないように、それはあなたものの(と思われますコードを表示していないので、どのようなコードを推測するのは非常に難しいightが起こっている)。推測で

、私は、このオブジェクトは各Paymentへの依存性を注入され、そしてあなたがそのためにもPaymentServiceを保存しようとする試みが発生し、フロースコープでPaymentを保存しようとしていると思います。

+0

。編集 –

関連する問題