Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个类不是javabean吗?_Java_Javabeans_Axis2 - Fatal编程技术网

这个类不是javabean吗?

这个类不是javabean吗?,java,javabeans,axis2,Java,Javabeans,Axis2,我试图使用现有的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!

我试图使用现有的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;
    }
}

BeanInfo是一个独立的东西。它最初是JavaBean告诉BeanShell它自己的机制,一种la Visual Basic:


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

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

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


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

我相信显式
BeanInfo
类在使用JavaBeans时是一种优化——它们通过手动提供所需的信息来避免通过反射分析bean类。提供这些信息不再是常见的做法,Axis2不缓存此类信息的事实主要是因为它是一个古老而复杂的类你可能想用更现代的东西来取代陈旧的工具包。我明白了。所以这条消息与web服务不工作的原因无关。谢谢你提供的信息。这不太可能。以前的一位雇主到处使用Axis2,我从来没有见过BeanInfo类。我们主要是从WSDL生成存根,但我认为这些存根没有BeanInfo类尼福斯也是。