2012-11-06 14 views
0

我正在尝试使用现有的Java类来使用Axis2创建Web服务。这个类不是Java Bean吗?

当我发送到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; 
    } 
} 
+0

我相信在使用JavaBeans时,显式的'BeanInfo'类是*优化*它们让您避免通过手工提供所需的信息来反射分析bean类。提供它们不再是一种常见的做法,而Axis2不会缓存这类信息的事实主要是它是一个陈旧而破旧的工具包,您可能想用更现代的东西来取代它。 – millimoose

+0

我明白了。因此,该消息与为什么Web服务无法正常工作无关。感谢您的信息。 – pacoverflow

+0

这不太可能。以前的雇主在任何地方都使用Axis2,而我从来没有见过一个BeanInfo类。我们主要从WSDL生成存根,但我不认为它们也有beaninfos。 – millimoose

回答

0

BeanInfo的实例由JavaBean的内省创建(见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-内核JAR)以及这些类加载器如何相互关联(例如,它们是由亲子关系相关)。