这个类不是Java Bean吗?

时间:2012-11-06 01:38:46

标签: 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!

我不确定该错误意味着什么,但它让我想知道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;
    }
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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

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