本人刚接触webservice不久,根据网上例子用myeclipse写了个webservice的客户端
服务端接口代码如下:
package com.scClients;public interface IHelloWebService {
public void SaveData(String id,String[] data,String lx,String dataname );
public void insData(String[] data,String lx,String dataname );
public String[] getIds(int count);
}客户端代码如下:
package com.scClients;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Properties;
import org.apache.ws.security.handler.WSHandlerConstants;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxy;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.security.wss4j.WSS4JOutHandler;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.codehaus.xfire.util.dom.DOMOutHandler;
import org.apache.ws.security.components.crypto.Merlin;public class scClientTest {
private WSS4JOutHandler wsOut;
private Service srvcModel;
private Client client;
/**
* 测试取多条id并录入多条数据
*/
public void test(){
srvcModel = new ObjectServiceFactory().create(IHelloWebService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String URL = "http://192.168.1.205:7001/wsTest/services/HelloWebService";
try{
IHelloWebService srvc = (IHelloWebService) factory.create(srvcModel,URL);
client = ((XFireProxy) Proxy.getInvocationHandler(srvc)).getClient();
String[] ids=srvc.getIds(1000);
for(int i=1;i<=1000;i++){
String[] wsdata={String.valueOf(i*2-1),null,String.valueOf(i*10-7),"中国","cao"};
srvc.SaveData(ids[i-1],wsdata, "wstest", "ws");
System.out.println("---- "+i+" ----");
}
client.close();
System.out.println("finished!");
}catch(Exception e){
System.out.println(e);
}
}
/**
* 测试web-security
*/
public void ws_test(){
srvcModel = new ObjectServiceFactory().create(IHelloWebService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String URL = "http://192.168.1.205:7001/wsTest/services/HelloWebService";
//String actions=WSHandlerConstants.ENCRYPT;;
try{
IHelloWebService srvc = (IHelloWebService) factory.create(srvcModel,URL);
client = ((XFireProxy) Proxy.getInvocationHandler(srvc)).getClient();
client.addOutHandler(new DOMOutHandler());
Properties properties = new Properties();
String actions =WSHandlerConstants.SIGNATURE;
properties.setProperty(WSHandlerConstants.ACTION,actions);
properties.setProperty(WSHandlerConstants.USER,"ws_security");
properties.setProperty(WSHandlerConstants.SIG_PROP_FILE,"outsecurity.properties");
// properties.setProperty(WSHandlerConstants.ENC_PROP_FILE,"/outsecurity.properties");
//properties.setProperty(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PASSWORD_TEXT);
properties.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordHandler.class.getName());
properties.setProperty(WSHandlerConstants.SIG_KEY_ID,"IssuerSerial");
//wsOut.setProperty(WSHandlerConstants.TTL_TIMESTAMP,"30");
wsOut = new WSS4JOutHandler(properties);
client.addOutHandler(wsOut);
//String[] ids=srvc.getIds(1000);
for(int i=1;i<=1000;i++){
//ArrayOfString wow=new ArrayOfString();
String[] wsdata={String.valueOf(i*2-1),null,String.valueOf(i*10-7),"中国","cao"};
String[] wowdata={"往日","cao",String.valueOf(i),String.valueOf(i*2),String.valueOf(i*2+21)};
srvc.insData(wsdata, "wstest", "ws");
srvc.insData(wowdata, "wowtest", "wow");
System.out.println("---- "+i+" ----");
}
client.close();
System.out.println("finished!");
}catch(Exception e){
System.out.println("客户端调用出错:"+e);
}
}
public static void main(String args[]){
scClientTest sct=new scClientTest();
//sct.test();
sct.ws_test();
}
}调用test方法时可以顺利通过,但是测试ws_test()方法的时候,运行到红字处时会报错:
org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: org.apache.ws.security.components.crypto.Merlin Not Found提示找不到org.apache.ws.security.components.crypto.Merlin 但是包含此class文件的jar包我已经通过buildpath导入到项目中了,请高人指点!~
服务端接口代码如下:
package com.scClients;public interface IHelloWebService {
public void SaveData(String id,String[] data,String lx,String dataname );
public void insData(String[] data,String lx,String dataname );
public String[] getIds(int count);
}客户端代码如下:
package com.scClients;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Properties;
import org.apache.ws.security.handler.WSHandlerConstants;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxy;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.security.wss4j.WSS4JOutHandler;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.codehaus.xfire.util.dom.DOMOutHandler;
import org.apache.ws.security.components.crypto.Merlin;public class scClientTest {
private WSS4JOutHandler wsOut;
private Service srvcModel;
private Client client;
/**
* 测试取多条id并录入多条数据
*/
public void test(){
srvcModel = new ObjectServiceFactory().create(IHelloWebService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String URL = "http://192.168.1.205:7001/wsTest/services/HelloWebService";
try{
IHelloWebService srvc = (IHelloWebService) factory.create(srvcModel,URL);
client = ((XFireProxy) Proxy.getInvocationHandler(srvc)).getClient();
String[] ids=srvc.getIds(1000);
for(int i=1;i<=1000;i++){
String[] wsdata={String.valueOf(i*2-1),null,String.valueOf(i*10-7),"中国","cao"};
srvc.SaveData(ids[i-1],wsdata, "wstest", "ws");
System.out.println("---- "+i+" ----");
}
client.close();
System.out.println("finished!");
}catch(Exception e){
System.out.println(e);
}
}
/**
* 测试web-security
*/
public void ws_test(){
srvcModel = new ObjectServiceFactory().create(IHelloWebService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String URL = "http://192.168.1.205:7001/wsTest/services/HelloWebService";
//String actions=WSHandlerConstants.ENCRYPT;;
try{
IHelloWebService srvc = (IHelloWebService) factory.create(srvcModel,URL);
client = ((XFireProxy) Proxy.getInvocationHandler(srvc)).getClient();
client.addOutHandler(new DOMOutHandler());
Properties properties = new Properties();
String actions =WSHandlerConstants.SIGNATURE;
properties.setProperty(WSHandlerConstants.ACTION,actions);
properties.setProperty(WSHandlerConstants.USER,"ws_security");
properties.setProperty(WSHandlerConstants.SIG_PROP_FILE,"outsecurity.properties");
// properties.setProperty(WSHandlerConstants.ENC_PROP_FILE,"/outsecurity.properties");
//properties.setProperty(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PASSWORD_TEXT);
properties.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordHandler.class.getName());
properties.setProperty(WSHandlerConstants.SIG_KEY_ID,"IssuerSerial");
//wsOut.setProperty(WSHandlerConstants.TTL_TIMESTAMP,"30");
wsOut = new WSS4JOutHandler(properties);
client.addOutHandler(wsOut);
//String[] ids=srvc.getIds(1000);
for(int i=1;i<=1000;i++){
//ArrayOfString wow=new ArrayOfString();
String[] wsdata={String.valueOf(i*2-1),null,String.valueOf(i*10-7),"中国","cao"};
String[] wowdata={"往日","cao",String.valueOf(i),String.valueOf(i*2),String.valueOf(i*2+21)};
srvc.insData(wsdata, "wstest", "ws");
srvc.insData(wowdata, "wowtest", "wow");
System.out.println("---- "+i+" ----");
}
client.close();
System.out.println("finished!");
}catch(Exception e){
System.out.println("客户端调用出错:"+e);
}
}
public static void main(String args[]){
scClientTest sct=new scClientTest();
//sct.test();
sct.ws_test();
}
}调用test方法时可以顺利通过,但是测试ws_test()方法的时候,运行到红字处时会报错:
org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: org.apache.ws.security.components.crypto.Merlin Not Found提示找不到org.apache.ws.security.components.crypto.Merlin 但是包含此class文件的jar包我已经通过buildpath导入到项目中了,请高人指点!~
解决方案 »
- 懂spagobi的帮帮忙!
- 求解'Apache的FTPClient上传.gz文件解压失败'
- java打印只显示最后1个 g.drawString()
- 循环输出的问题?
- 在Struts中的全局转发变量是怎么回事?在同一站点下都可以用吗?(是不是相当于常量一样)
- 求助:could not initialize a collection: [cn.com.app.factory.hibernate.Item.storeItems#1001]
- 求助String()构造函数
- 同样的项目在TOMCAT5.0下可以运行,但是在WEBLOGIC 下报错,can't retrieve action,什么原因?
- 用什么样的java或者sql语句可以彻底清空一个已经连接的*.dbf数据库?
- java.lang.ExceptionInInitializerError
- 请教我新生成了xml,用stringbuffer写入xml文件.但是写后前面有乱码.
- webservice客户端程序的发布
用xfire写的webservice应该如何来实现安全验证呢,希望高人帮忙指点!~
建议你可以在加入包之后,刷新工程文件,并重新编译一下工程,然后再运行你的程序。
如果不用到wss4j里的类,我把client.addOutHandler(new DOMOutHandler());
Properties properties = new Properties();
String actions =WSHandlerConstants.SIGNATURE;
properties.setProperty(WSHandlerConstants.ACTION,actions);
properties.setProperty(WSHandlerConstants.USER,"ws_security");
properties.setProperty(WSHandlerConstants.SIG_PROP_FILE,"outsecurity.properties");
// properties.setProperty(WSHandlerConstants.ENC_PROP_FILE,"/outsecurity.properties");
//properties.setProperty(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PASSWORD_TEXT);
properties.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordHandler.class.getName());
properties.setProperty(WSHandlerConstants.SIG_KEY_ID,"IssuerSerial");
//wsOut.setProperty(WSHandlerConstants.TTL_TIMESTAMP,"30");
wsOut = new WSS4JOutHandler(properties);
client.addOutHandler(wsOut);
这一段去掉直接调用service的话可以调用成功