Не удалось сериализовать выполнение потока - PullRequest
2 голосов
/ 17 января 2012

Исключение:

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

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

Контроллер платежей

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


....
}


}

Ошибка происходит здесь:

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

Ответы [ 2 ]

1 голос
/ 18 января 2012

у вас есть каталог (src/groovy) в вашем grails project. поместите ваш 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 голосов
/ 17 января 2012

Ссылаясь на сообщение об исключении, кажется, что ValidationService не сериализуем (хотя вы не показали никакого кода, поэтому очень трудно угадать, что может происходить).

На догадку,Я бы сказал, что этот объект внедряется зависимостями в каждый Payment, и вы пытаетесь сохранить Payment в области действия потока, что, следовательно, вызывает попытку также сохранить PaymentService.

...