我正在尝试使用现有的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;
}
}
答案 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)以及这些类加载器如何相互关联(例如它们是否相关)通过亲子关系)。