场景二 (支持方法传入参数为字符串数组类型)
若CommunicationImpl类中,有两方法,
public Map get(Object[] o)
public Map set(Map<String, String> m)
默认情况下,该两方法都可发布为XML-RPC服务。
但若有方法签名为public Map get(String[] s),传入参数改为了字符串数组,要发布为XML-RPC服务,apache-xmlrpc-3.1.3版本中,目前还未支持。
但也有方法可以实现。具体如下:
1 创建TypeConverterFactoryImpl的子类,重写getTypeConverter(Class pClass)方法,创建stringArrayTypeConverter。
2调用setTypeConverterFactory方法,设定1步中创建的实例。
如:
PropertyHandlerMapping phm = new PropertyHandlerMapping();
phm.setTypeConverterFactory(new MyTypeConverterFactoryImpl());
public class MyTypeConverterFactoryImpl extends TypeConverterFactoryImpl{
public TypeConverter getTypeConverter(Class pClass) {
if (pClass.isAssignableFrom(String[].class)) {
return stringArrayTypeConverter;
}
return super.getTypeConverter(pClass);
}
private static final TypeConverter stringArrayTypeConverter = new MyIdentityTypeConverter(Object[].class);
private static class MyIdentityTypeConverter implements TypeConverter {
private final Class clazz;
MyIdentityTypeConverter(Class pClass) {
clazz = pClass;
}
public boolean isConvertable(Object pObject) {
return pObject == null || clazz.isAssignableFrom(pObject.getClass());
}
public Object convert(Object pObject) {
if (pObject instanceof Object[]) {
Object[] objects = (Object[]) pObject;
String[] result = new String[objects.length];
for (int i = 0; i < objects.length; i++) {
result[i] = (String)objects[i];
}
return result;
}
return pObject;
}
}
}