0

我正在尝试使用现有的 Java 类来创建使用 Axis2 的 Web 服务。

当我向 Web 服务发送请求时,Axis2 显示以下消息:

[01 Nov 2012 16:37:05:244] classloader.BeanInfoCache: Unable to locate a BeanInfo cache for class ems.shared.Fti (stopClass=class java.lang.Object). This will negatively affect performance!

我不确定这个错误是什么意思,但这让我想知道 ems.shared.Fti 类是否不能满足成为 Java Bean 的所有要求。你能看出这门课有什么问题吗?

package ems.shared;

import java.io.Serializable;

public class Fti implements Serializable
{
    private static final long serialVersionUID = 7476379431395094501L;

    public static final Fti UNDEFINED = new Fti(-1);

    public static final Fti BROADCAST = new Fti((int) (Math.pow(2, 20) - 2));

    private int fti;

    public Fti() {

    }

    public Fti(int fti)
    {
        this.fti = fti;
    }

    public Fti(String fti)
    {
        try
        {
            this.fti = Integer.parseInt(fti);
        }
        catch (NumberFormatException e)
        {
            throw new IllegalArgumentException(fti + " is not a valid FTI");
        }
    }

    public void setFti(int fti) {
        this.fti = fti;
    }

    public int getFti() {
        return fti;
    }

    public int asInt()
    {
        return this.fti;
    }

    @Override
    public String toString()
    {
        return String.valueOf(fti);
    }

    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + fti;
        return result;
    }

    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Fti other = (Fti) obj;
        if (fti != other.fti)
            return false;
        return true;
    }
}
4

2 回答 2

0

BeanInfo 实例由 JavaBean 内省创建(请参阅JRE Javadoc)。正如 duffymo 所指出的,可以将 BeanInfo 与 JavaBean 一起显式提供,在这种情况下,内省器只需加载该 BeanInfo。这主要用于 UI 组件,不是强制性的。对于没有显式 BeanInfo 的 JavaBean,内省器只需使用反射构造 BeanInfo 实例。这就是你的情况。

关键是 JRE 不缓存 BeanInfo 对象。原因是它无法做到这一点而不会有导致类加载器泄漏的风险(请参阅IZ67457以获取由于尝试在某些版本的 IBM JRE 中缓存这些对象而导致的错误示例)。但是,使用反射构造一个 BeanInfo 对象是一项代价高昂的操作。因此 Axis2 有自己的 BeanInfo 缓存。该缓存经过精心设计,以避免类加载器泄漏。

您收到的消息(顺便说一句是警告,而不是错误)只是说明在您的情况下 Axis2 无法使用缓存的 BeanInfo 对象。这有两个可能的原因:要么您处于无法缓存 BeanInfo 对象而不会导致类加载器泄漏的场景,或者您处于可以缓存 BeanInfo 对象而不会导致类加载器泄漏的场景但这不受 BeanInfo 缓存的支持(即您在缓存实现中遇到了限制)。

为了进一步分析这一点,您需要确定哪个类加载器加载 Fti 类,哪个类加载器加载 BeanInfoCache 类(即axis2-kernel JAR)以及这些类加载器如何相互关联(例如它们是否由父级关联) - 子女关系)。

于 2012-11-06T08:40:00.413 回答
0

BeanInfo 是独立的。它最初是 JavaBean 告诉 Bean shell 自身的机制,类似于 Visual Basic:

http://docs.oracle.com/cd/E23095_01/Platform.93/ATGProgGuide/html/s0503beaninfoexample01.html

于 2012-11-06T01:44:52.087 回答