簡體   English   中英

此類不是Java Bean嗎?

[英]Is this class not a Java Bean?

我正在嘗試使用現有的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通過Bean Visual Basic告訴Bean外殼的機制:

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

BeanInfo實例由JavaBean內省器創建(請參見JRE Javadoc )。 正如duffymo指出的那樣,可以將BeanInfo與JavaBean一起顯式提供,在這種情況下,內省者將簡單地加載該BeanInfo。 這主要用於UI組件,不是必需的。 對於沒有顯式BeanInfo的JavaBean,自省者只是使用反射來構造BeanInfo實例。 這就是您的情況。

關鍵是,JRE不緩存BeanInfo對象。 原因是它不能這樣做,而不會導致類加載器泄漏(請參閱IZ67457 ,以獲取由於嘗試在某些版本的IBM JRE中緩存這些對象而導致的錯誤的示例)。 但是,使用反射構造BeanInfo對象是一項昂貴的操作。 因此,Axis2具有自己的BeanInfo緩存。 該緩存經過精心設計,以避免類加載器泄漏。

您收到的消息(該BTW是警告,而不是錯誤)只是說在您的情況下Axis2無法使用緩存的BeanInfo對象。 可能有兩個原因:要么處於無法緩存BeanInfo對象而不會潛在地導致類加載器泄漏的場景中,要么處於一種可以緩存BeanInfo對象而不會導致類加載器泄漏的場景中。但是BeanInfo緩存不支持該功能(即您在緩存實現中遇到了限制)。

為了進一步分析,需要確定哪個類加載器加載Fti類,哪個類加載器加載BeanInfoCache類(即axis2-kernel JAR)以及這些類加載器如何相互關聯(例如,它們是否由父級關聯) -兒童關系)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM