2014-09-22 6 views
0

С CDI (Weld) Я реализовал метод производителя для несериализуемого класса. Если производитель получил сериализованная и поле NonSerializableObject ушел, я переинициализировать NonSerializableObject:CDI: Почему мое переходное поле сериализуется?

@SessionScoped 
public class NonSerializableObjectProducer implements Serializable { 

/** UUID */ 
private static final long serialVersionUID = -436472364723647647367L; 

/** my transient non serializbale object */ 
private transient NonSerializableObject nonSerializableObject; 

@SessionScoped 
@Produces 
protected NonSerializableObject produceNonSerializableObject() { 
    if (nonSerializableObject == null) { 
     // reinitialize object and set it 
     // nonSerializableObject = ... 
    } 
    return nonSerializableObject; 
} 

Я впрыснуть NonSerializableObject как:

@SessionScoped 
public class UseSerializableObject implements Serializable { 

    private static final long serialVersionUID = 62378785678643784689L; 

    @Inject 
    private transient NonSerializableObject nonSerializableObject; 

    public void doSomething() { 
     nonSerializableObject.go(); 
    } 
} 

Когда мой сервер приложений (Tomcat 7) повторно развертывает следующие Исключение:

Sep 22, 2014 4:41:58 PM org.apache.catalina.session.StandardSession writeObject 
WARNING: Cannot serialize session attribute WELD_S#5 for session 4694BB90FF1BBD8 
java.io.NotSerializableException: com.MemberOfNonSerializableObject 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1181) 

Итак, переменная-член моей NonSerializableObject получает сериализацию д. Зачем? Я объявил все как временное!

+1

Я бы подумал, что это '@ SessionScoped', он также хранится в' HttpSession'. Это сериализация «HttpSession», которая терпит неудачу, а не объекта 'UseSerializableObject'. –

ответ

3

Ваш метод:

@SessionScoped 
@Produces 
protected NonSerializableObject produceNonSerializableObject() {} 

производит @SessionScoped объект, который не является сериализации. Все @RequestScoped, @SessionScoped и @ApplicationScoped beans должны быть Serializable.

Таким образом, это сработает, если вы удалите @SessionScoped из метода производителя.

+0

Теперь, когда вы это говорите, мне кажется ясным ... Метод производителя не заботится о переходном поле. Я должен обернуть экземпляр NonSerializableObject в сериализуемом объекте с полем переходных процессов. – Ginkgochris

+0

Нет обертки, вместо этого лучше отметить метод производителя @RequestScoped! Таким образом, никогда не будет экземпляра NonSerializableObject непосредственно на веб-сайте. – Ginkgochris

Смежные вопросы