Вопрос

Исключение:

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

Команда MakePaymentStep1

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()
 }
Это было полезно?

Решение

у вас есть каталог (src/groovy) в вашем grails project.поместите свой код генерирования кода в этот каталог, и код вашего кода кода будет иметь следующий вид:

validation Service class

общий

makepaymentStepCommand

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top