本文介绍了JSF中的ViewScop Bean中的NotSerializableException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面编写的代码是通过使用JSF2.0/Primefaces从数据库下载文件的.下面的代码是SessionScoped Bean,可以很好地运行,并且我能够下载存储的文件

The code written below is to download the file from the database by using JSF2.0/Primefaces. The code below which is SessionScoped Bean runs perfectly fine and I am able to download the stored file

@ManagedBean
@SessionScoped
public class FileProcessBB{

private ScreenDisplayData screenDisplayData;

    public void selectAttachment() {
        AttachedFileTable attachedFileTable = new AttachedFileTableManager().getAttachedFileById(screenDisplayData.getSelectedAttachedFileBO().getAttachedFileTableId());
        InputStream inputStream = new ByteArrayInputStream(attachedFileTable.getAttachedFile());
        String contentType = attachedFileTable.getAttachedFileContentType();
        String fileName = attachedFileTable.getAttachedFileName();
        screenDisplayData.setAttachedFileStreamContent(new DefaultStreamedContent(inputStream, contentType, fileName));
    }
}

但是我想在ViewScoped Bean中实现相同的功能.为了实现这一点,我做了如下必要的更改(为ViewScoped Bean实现Serializable)

But I want implement the same functionality into ViewScoped Bean. To achieved that I made necessary changes as below (implementing Serializable for ViewScoped Bean)

@ManagedBean
@ViewScoped
public class FileProcessBB implements Serializable{
/**
 * 
 */
private static final long serialVersionUID = 6137719800118206851L;

private ScreenDisplayData screenDisplayData;

    public void selectAttachment() {
        AttachedFileTable attachedFileTable = new AttachedFileTableManager().getAttachedFileById(screenDisplayData.getSelectedAttachedFileBO().getAttachedFileTableId());
        InputStream inputStream = new ByteArrayInputStream(attachedFileTable.getAttachedFile());
        String contentType = attachedFileTable.getAttachedFileContentType();
        String fileName = attachedFileTable.getAttachedFileName();
        screenDisplayData.setAttachedFileStreamContent(new DefaultStreamedContent(inputStream, contentType, fileName));
    }
}

ScreenDisplayData

ScreenDisplayData

public class ScreenDisplayData implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -3339259618782904262L;

    private StreamedContent attachedFileStreamContent;
    private AttachedFileBO selectedAttachedFileBO;


    //getter setter

}

我还在AttachedFileBO类中实现了Serializable. AttachedFileTable是一个Entity类,因此它已经实现了Serializable

I have implements Serializable in the AttachedFileBO class also. AttachedFileTable is an Entity class hence it already implements Serializable

我在哪里想念Serializable?

Where did I am missing Serializable?

我得到的期望如下

[ERROR   ] SRVE0777E: Exception thrown by application class 'java.io.ObjectOutputStream.writeObject0():1200'
java.io.NotSerializableException: java.io.ByteArrayInputStream
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1200)
  at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1513)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1436)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
  at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1513)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1436)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
  at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1513)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1436)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:363)
  at java.util.HashMap.writeObject(HashMap.java:867)
  at sun.reflect.GeneratedMethodAccessor156.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
  at java.lang.reflect.Method.invoke(Method.java:613)
  at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1047)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1500)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1436)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
  at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1382)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1190)
  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:363)
  at java.util.HashMap.writeObject(HashMap.java:867)
  at sun.reflect.GeneratedMethodAccessor156.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
  at java.lang.reflect.Method.invoke(Method.java:613)
  at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1047)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1500)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1436)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1194)
  at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1382)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1190)
  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:363)
  at org.apache.myfaces.shared_impl.util.StateUtils.getAsByteArray(StateUtils.java:273)
  at org.apache.myfaces.shared_impl.util.StateUtils.construct(StateUtils.java:235)
  at org.apache.myfaces.renderkit.html.HtmlResponseStateManager.getViewState(HtmlResponseStateManager.java:314)
  at org.apache.myfaces.application.jsp.JspStateManagerImpl.getViewState(JspStateManagerImpl.java:626)
  at org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartialRendering(PartialViewContextImpl.java:443)
  at org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:344)
  at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:88)
  at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:358)
  at javax.faces.component.UIComponent.encodeAll(UIComponent.java:609)
  at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1159)
  at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:263)
  at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:85)
  at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
  at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
  at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1221)
  at [internal classes]

推荐答案

在模型中,您根本不应使用InputStream风味的属性.您应该改用byte[].

In the model, you should not be using InputStream flavored properties at all. You should be using byte[] instead.

替换不可序列化的基于InputStream的属性,例如

Replace non-serializable InputStream based properties like

private ByteArrayInputStream content;

通过可序列化的基于byte[]的属性,例如

by serializable byte[] based properties like

private byte[] content;

一种形式和另一种形式之间的转换应完全在方法范围内进行.

Transforming between the one and the other form should be done purely inside method scope.

这篇关于JSF中的ViewScop Bean中的NotSerializableException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-31 20:54