【问题标题】:java.io.NotSerializableException With datatypejava.io.NotSerializableException 与数据类型
【发布时间】:2013-10-26 19:59:32
【问题描述】:

我在 apache 启动时收到此警告。我正在尝试使用HashMap<Integer,webservice.DataProd> 设置会话属性“productos”。我尝试使 DataProd 实现可序列化,但仍然相同,所以由于我是 web 服务的新手,所以我不知道该怎么做。

这是数据产品

package Producto;

import java.io.Serializable;
import java.util.Objects;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

@XmlAccessorType(XmlAccessType.FIELD)
public class DataProd{
    private String nombre;
    private String descripcion;
    private String especificacion;
    private int id;
    private double precio;
    private int cantidadVendidos;

    public DataProd(String nom, String desc, double costo, int identificador, String esp, int cantidad){
        nombre = nom;
        descripcion = desc;
        precio = costo;
        id = identificador;
        especificacion = esp;
        cantidadVendidos = cantidad;
    } 

    public DataProd(){}

    public String getNombre(){
        return nombre;
    }

    public String getDescripcion(){
        return descripcion;
    }

    public double getPrecio(){
        return precio;
    }

    public int getCantidadVendidos(){
        return cantidadVendidos;
    }

    public int getId(){
        return id;
    }
     @Override
    public String toString(){
        return getNombre() + " - " + getId();
    }
    @Override
    public boolean equals(Object d){
        DataProd s = (DataProd) d;
        return ((getNombre().equals(s.getNombre()))&&(getDescripcion().equals(s.getDescripcion()))&&(getId() == s.getId())&&(getPrecio()==s.getPrecio()));
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 11 * hash + Objects.hashCode(this.getNombre());
        hash = 11 * hash + Objects.hashCode(this.getDescripcion());
        hash = 11 * hash + this.getId();
        hash = 11 * hash + (int) (Double.doubleToLongBits(this.getPrecio()) ^ (Double.doubleToLongBits(this.getPrecio()) >>> 32));
        return hash;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @param descripcion the descripcion to set
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    /**
     * @return the especificacion
     */
    public String getEspecificacion() {
        return especificacion;
    }

    /**
     * @param especificacion the especificacion to set
     */
    public void setEspecificacion(String especificacion) {
        this.especificacion = especificacion;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @param precio the precio to set
     */
    public void setPrecio(double precio) {
        this.precio = precio;
    }

    /**
     * @param cantidadVendidos the cantidadVendidos to set
     */
    public void setCantidadVendidos(int cantidadVendidos) {
        this.cantidadVendidos = cantidadVendidos;
    }
}

这是我的堆栈:

WARNING: Cannot serialize session attribute productos for session 5D0658D2DFB89594B8F8D19FAC54C66B
java.io.NotSerializableException: webservice.DataProd
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
    at java.util.HashMap.writeObject(HashMap.java:1100)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
    at org.apache.catalina.session.StandardSession.writeObject(StandardSession.java:1671)
    at org.apache.catalina.session.StandardSession.writeObjectData(StandardSession.java:1077)
    at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:432)
    at org.apache.catalina.session.StandardManager.unload(StandardManager.java:353)
    at org.apache.catalina.session.StandardManager.stopInternal(StandardManager.java:518)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5622)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
    at org.apache.catalina.manager.ManagerServlet.undeploy(ManagerServlet.java:1359)
    at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:380)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:611)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

谢谢你,对不起我的英语水平。

【问题讨论】:

  • 注意,这个问题针对的是Tomcat 7,目前接受的答案并没有说明原因,但是投票第二多的可以。
  • 我在发布之前阅读了那篇文章,但我无法用该信息解决我的问题。
  • 您应该首先了解这不是问题。错误问题,警告可能。正如@pap 的回答中所解释的,您在 Web 应用程序会话中存储了一个不可序列化的对象,因此当 Tomcat 尝试将会话序列化到磁盘时,它将失败,因为有一个不可序列化的对象试图被序列化。看起来您还没有阅读该答案,如果您阅读了,则说明您没有应用如何补救部分中提出的解决方案。
  • 顺便说一句,您可以忽略这些消息,因为它们不会伤害 也不会您的网络应用程序也不会你的网络服务也不你的tomcat。

标签: java tomcat


【解决方案1】:

DataProd改为实现Serializable

public class DataProd implements Serializable {

【讨论】:

  • 你确定你编译并部署了正确的类吗?
猜你喜欢
  • 2015-11-20
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2012-10-15
  • 2015-09-15
  • 2011-06-22
相关资源
最近更新 更多