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クラスがJavaBeanであるためのすべての要件を満たしていないのではないかと思います。このクラスに何か問題がありますか?

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オブジェクトをキャッシュしないということです。その理由は、クラスローダーのリークを引き起こすリスクなしにそれを行うことができないためです(IBM JREの特定のバージョンでこれらのオブジェクトをキャッシュしようとすることによって引き起こされるバグの例については、IZ67457を参照してください)。ただし、リフレクションを使用してBeanInfoオブジェクトを作成することは、コストのかかる操作です。したがって、Axis2には独自のBeanInfoキャッシュがあります。そのキャッシュは、クラスローダーのリークを回避するように注意深く設計されています。

表示されるメッセージ(ところで、エラーではなく警告です)は、あなたの場合、Axis2がキャッシュされたBeanInfoオブジェクトを使用できないことを示しています。これには2つの理由が考えられます。クラスローダーのリークを引き起こす可能性なしにBeanInfoオブジェクトをキャッシュできないシナリオにあるか、クラスローダーのリークを引き起こさずにBeanInfoオブジェクトをキャッシュできるシナリオにあるかのいずれかです。ただし、これはBeanInfoキャッシュではサポートされていません(つまり、キャッシュの実装に制限があります)。

これをさらに分析するには、どのクラスローダーがFtiクラスをロードするか、どのクラスローダーがBeanInfoCacheクラス(つまり、axis2-kernel JAR)をロードするか、およびこれらのクラスローダーが互いにどのように関連しているか(たとえば、親によって関連付けられているか)を判断する必要があります。 -子関係)。

于 2012-11-06T08:40:00.413 に答える
0

BeanInfoは別のものです。これは元々、JavaBeanがBeanシェルにそれ自体について通知するメカニズムでした。つまり、VisualBasicです。

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

于 2012-11-06T01:44:52.087 に答える