OSGi环境中部署XML-RPC Server(2)

来源:互联网 发布:魔法王座翅膀5升6数据 编辑:程序博客网 时间:2024/05/16 14:36

场景二 (支持方法传入参数为字符串数组类型)

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版本中,目前还未支持。


但也有方法可以实现。具体如下:

创建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;

         }

    }

}


原创粉丝点击