gpt4 book ai didi

java - 跟踪 JSF 应用程序中的序列化问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:03:39 25 4
gpt4 key购买 nike

我们有一个 JSF 应用程序,有时会给出 NotSerializedException,但我们不知道哪个对象出现了问题。 Stacktrace 几乎没有提供任何线索,因为它指出“Object”是无法序列化的类型。

我想找到定位该字段的不同方法。

我们已经使用我发布的解决方案解决了该问题,但我想 a) 分享它并 b) 看看是否可以改进。

最佳答案

我们创建了以下类并将其添加为 web.xml 的监听器。这会导致性能下降,因此如果性能出现问题,请不要忘记再次将其删除。这解决了除集群上 servlet 的序列化之外的大多数序列化问题。

public class SessionAttributeTracker implements HttpSessionAttributeListener
{

private static final Logger logger = LoggerFactory.getLogger(SessionAttributeTracker.class);

@Override
public void attributeAdded(final HttpSessionBindingEvent sessionBindingEvent)
{
Object obj = sessionBindingEvent.getValue();
logger.debug("Session attribute added: {}", obj);
if (!isSerializable(obj))
{
logger.warn("Attribute '{}' added to session with non-serializable object: {}",
sessionBindingEvent.getName(),
sessionBindingEvent.getValue());

}
}

private boolean isSerializable(final Object obj)
{
logger.debug("Checking serializability of : {}", obj.getClass().getName());
boolean ret = false;
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
try
{
oos = new ObjectOutputStream(out);
oos.writeObject(obj);
ret = true;
}
catch (Exception e)
{
for (Field f : obj.getClass().getDeclaredFields())
{
logger.trace("obj {} felt {}", obj, f.getName());
if ((f.getModifiers() & Modifier.TRANSIENT) == 0)
{
f.setAccessible(true);
try
{
Object object = f.get(obj);
oos = new ObjectOutputStream(out);
// logger.debug("Hopper over writeObject");
oos.writeObject(object);
}
catch (Exception e1)
{
logger.debug("Problem encountered while serializing attribute {}", f.getName(), e1);
}
}
}
logger.warn("Serilization problem.", e);
return ret;
}
finally
{
IOUtils.closeQuietly(oos);
}
return ret;
}

private String threadDump()
{
StringBuffer fullThreadDump = new StringBuffer();
Thread t = Thread.currentThread();
State state = t.getState();
String tName = t.getName();
if (state != null)
{
fullThreadDump.append(" ").append(tName).append(": ").append(state).append("\n");
}
StackTraceElement[] stes = t.getStackTrace();
for (StackTraceElement stackTraceElement : stes)
{
fullThreadDump.append(" at ").append(stackTraceElement).append("\n");
}

return fullThreadDump.toString();
}

@Override
public void attributeRemoved(final HttpSessionBindingEvent sessionBindingEvent)
{
}

@Override
public void attributeReplaced(final HttpSessionBindingEvent sessionBindingEvent)
{
}

}

关于java - 跟踪 JSF 应用程序中的序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21726778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com