做soap动态代理,遇到困难:无法取得方法参数名,apache soap的设定方法参数必须要知道参数名么?

leafxx 2006-05-25 09:59:33
Parameter(java.lang.String name, java.lang.Class type, java.lang.Object value, java.lang.String encodingStyleURI)

我如何在运行期取得方法的具体参数名称,Java反射没有提供这种功能

Soap的Call设定参数,必须要知道精确的参数名称么?客户端有没有什么简单的方法可以取得?
...全文
441 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
leafxx 2006-05-26
  • 打赏
  • 举报
回复
后来在网上发现有一个更好的代码,比我的更好,发上来给大家分享一下:)

客户端部分代码,使用SoapProxy动态代理远程服务,好像在本地使用一样
try {
Class[] interfaces = new Class[] { HelloService.class };
HelloService hello = (HelloService) (SoapProxy.newInstance(
"urn:hello", interfaces));
log.info(hello.sayHelloTo("Jeffrey"));
} catch (Exception e) {
e.printStackTrace();
}
Server端:
public interface HelloService {
String sayHelloTo(String name);

String sayHelloTo(Name name);
}

/**
* A simple demo service which generates "hello".
* @author Jeffrey Hsu
* @version 0.1, 2006-5-24
*/
public class HelloServiceImpl implements HelloService {
public String sayHelloTo(String name) {
return "Greetings, " + name + ", What can I do for you?";
}

public String sayHelloTo(Name name) {
return "Greetings, " + name + ", What can I do for you?";
}
}

下面是SOAP的动态代理类,封装了SOAP的访问细节,更方便客户端使用:
public class SoapProxy implements InvocationHandler {
private static URL serverURL = null;
final private static String PARAM_NAME = "Parameter";
private String urn = null;
private SOAPMappingRegistry smr = null;
private BeanSerializer beanSer = null;

private SoapProxy(String urn) {
this.urn = urn;

if (serverURL == null) {
synchronized (this) {
if (serverURL == null) {
// Your rpcrouter url
String url = "http://localhost:8080/SoapDemo/servlet/rpcrouter";

try {
serverURL = new URL(url);
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
}
}
}

final public static Object newInstance(String urn, Class[] interfaces) {
SoapProxy pi = new SoapProxy(urn);

return (pi.initialize(interfaces));
}

// Implementation of the InvocationHandler interface
final public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable {
Call call = new Call();
call.setTargetObjectURI(urn);
call.setMethodName(m.getName());
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);

java.util.Vector params = new java.util.Vector();

for (int i = 0; i < args.length; i++) {
if (isSimple(args[i]) || isSimpleArray(args[i])) {
params.add(new Parameter(PARAM_NAME + (i + 1),
args[i].getClass(), args[i], null));
} else if (isVector(args[i])) {
addMapping((java.util.Vector) args[i]);
params.add(new Parameter(PARAM_NAME + (i + 1),
args[i].getClass(), args[i], null));
}

else if (isArray(args[i])) {
if (smr == null) {
smr = new SOAPMappingRegistry();
}

if (beanSer == null) {
beanSer = new BeanSerializer();
}

ArraySerializer arraySer = new ArraySerializer();
smr.mapTypes(Constants.NS_URI_SOAP_ENC, null, null, beanSer,
beanSer);
smr.mapTypes(Constants.NS_URI_SOAP_ENC, null,
args[i].getClass(), arraySer, arraySer);
params.add(new Parameter(PARAM_NAME + (i + 1),
args[i].getClass(), args[i], null));
}

else {
if (smr == null) {
smr = new SOAPMappingRegistry();
}

if (beanSer == null) {
beanSer = new BeanSerializer();
}

String qnamePart = args[i].getClass().getName();

smr.mapTypes(Constants.NS_URI_SOAP_ENC,
new QName(urn, qnamePart), args[i].getClass(), beanSer,
beanSer);
params.add(new Parameter(PARAM_NAME + (i + 1),
args[i].getClass(), args[i], null));
}
}

if (params.size() != 0) {
call.setParams(params);
}

if (smr != null) {
call.setSOAPMappingRegistry(smr);
}

Response resp = call.invoke(serverURL, "");

if (!resp.generatedFault()) {
Parameter ret = resp.getReturnValue();

return (ret.getValue());
} else {
Fault fault = resp.getFault();
throw new SOAPException(fault.getFaultCode(), fault.getFaultString());
}
}

private Object initialize(Class[] interfaces) {
return (java.lang.reflect.Proxy.newProxyInstance(getClass()
.getClassLoader(),
interfaces, this));
}

private boolean isSimple(Object o) {
if (o instanceof Integer || o instanceof Double ||
o instanceof Boolean || o instanceof Byte ||
o instanceof Character || o instanceof Float ||
o instanceof String || o instanceof Short || o instanceof Long) {
return (true);
}

return (false);
}

private boolean isSimpleArray(Object o) {
if (o instanceof int[] || o instanceof boolean[] ||
o instanceof long[] || o instanceof float[] ||
o instanceof short[] || o instanceof byte[] ||
o instanceof java.lang.Integer[] ||
o instanceof java.lang.Double[] ||
o instanceof java.lang.Boolean[] ||
o instanceof java.lang.Byte[] ||
o instanceof java.lang.Float[] ||
o instanceof java.lang.String[] ||
o instanceof java.lang.Short[] ||
o instanceof java.lang.Long[]) {
return (true);
}

return (false);
}

private boolean isVector(Object o) {
if (o instanceof java.util.Vector) {
return (true);
}

return (false);
}

private boolean isArray(Object o) {
if (o instanceof Object[]) {
return (true);
}

return (false);
}

private void addMapping(java.util.Vector v) {
Object o = v.get(0);

if (o == null) {
return;
}

if (isSimple(o) || isSimpleArray(o)) {
// System.out.println("Vector contains simple elements only.");
} else if (isVector(o)) {
// System.out.println("Recursive Vector...");
addMapping((java.util.Vector) o);
} else {
if (smr == null) {
smr = new SOAPMappingRegistry();
}

if (beanSer == null) {
beanSer = new BeanSerializer();
}

// System.out.println("Adding a default mapping");
smr.mapTypes(Constants.NS_URI_SOAP_ENC, null, null, beanSer, beanSer);
}
}
}
leafxx 2006-05-25
  • 打赏
  • 举报
回复
问题已经解决了,apache soap可以指定随意参数名
yyjzsl 2006-05-25
  • 打赏
  • 举报
回复
路过,顶下
didoleo 2006-05-25
  • 打赏
  • 举报
回复
能不能把你的做例子,给大家学习一下下.

YuLimin 2006-05-25
  • 打赏
  • 举报
回复
解决了就分享一下:)

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧