本人刚接触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导入到项目中了,请高人指点!~

解决方案 »

  1.   

    自己顶一下
    用xfire写的webservice应该如何来实现安全验证呢,希望高人帮忙指点!~
      

  2.   

    IHelloWebService 调用好像错误。
    建议你可以在加入包之后,刷新工程文件,并重新编译一下工程,然后再运行你的程序。
      

  3.   

    刷新以后还是会出错呢...
    如果不用到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的话可以调用成功