2012-11-06 35 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)以及這些類加載器如何相互關聯(例如,它們是由親子關係相關)。