Frage

Ausnahme:

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:

Diskussion:

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

Problem:
Ich habe diesen Fehler in meinem Grails-Projekt erhalten

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

Hinweis:

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

jede Hilfe, danke

Bearbeiten:

Validierungsdienst

 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
  }
}
}

MakePaymentStep1Command

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;
    })
}
 }

Zahlungskontrolleur

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')
    }


....
}


}

Der Fehler tritt hier auf:

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

War es hilfreich?

Lösung

Sie haben ein (src/groovy)-Verzeichnis in Ihrem grails project.Fügen Sie Ihren validation Service class in dieses Verzeichnis ein, und Ihr makepaymentStepCommand lautet wie folgt:

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.

Andere Tipps

Wenn Sie sich die Ausnahmemeldung ansehen, scheint es, als ob ValidationService nicht serialisierbar ist (obwohl Sie keinen Code angezeigt haben, ist es sehr schwierig zu erraten, was möglicherweise passiert).

Vermutlich würde ich sagen, dass dieses Objekt in jeden Payment abhängig ist, und Sie versuchen, einen Payment im Ablaufbereich zu speichern, wodurch versucht wird, auch einen PaymentService zu speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top