CXF怎样通过代码方式发布WebService到当前WEB容器?

请教一下,CXF怎样使用代码方式发布WEBService到当前WEB容器?

非常感谢!


问题补充:非常感谢!
ServerFactoryBean svrFactory = new ServerFactoryBean(); 
        svrFactory.setServiceClass(impl.getClass()); 
        svrFactory.setAddress("/" + serviceName); 
        svrFactory.setServiceBean(impl); 
        svrFactory.create(); 

这种形式正是我所需要的。

另外,可以通过代码发布WebService了, 那么,如果我想取消刚才发布的WebService怎么做呢?3Q
问题补充:destory 并非是取消某一个WebService的发布吧?我的意思是仅仅取消某一个特定的WebService,其他的不变。

回答: CXF怎样通过代码方式发布WebService到当前WEB容器?

  1. 参考这个:
    http://www.iteye.com/problems/94410

    使用servlet发布webservice也是一种办法。

    或者用spring整合cxf的方式发布webservice:
    http://www.blogjava.net/icewee/archive/2012/07/06/382399.html
    http://www.cnblogs.com/hoojo/archive/2011/03/30/1999563.html

急求ruby通过savon的方式连接webservice的方法,在线等!!!

  1. Q
    如题(明天就结贴)
    通过soap4r方式连接webservice是可以的,但是用savon连接就是不行,求教,能给个小例子更好,我是用Rho studio开发的,十分感谢!
    email:[email protected]  
  2. A
    既然按照例子做得不到值,应该是本地环境的问题,还是单步调试找找问题所在吧

求助:flex中如何代码调用java webservice中的List<T>集合

  1. Q
        俺是做java后台的,但最近要做一个flex的仪表程序,现只欠不知怎么在flex代码中调用webservice中的List<T>集合。请各位人兄帮忙!!!
    现模拟代码如下:
    服务端:
    @WebService(serviceName="DriverWebService")
    public class DriverWebService {
    @Autowired
    private DriverService driverService;

    @WebMethod
    public List<Driver> getDriverList(){
    return this.driverService.getDriverList();
    }
    }

    flex客户端:
    protected function InitApp():void
    {
          var coll:ArrayCollection = driverWebService.getDriverList().result as ArrayCollection;
          for(var i:int = 0; i<coll.length; i++) {  
    trace(coll.getItemAt(i).name);  
         }  
    }
    现在我的问题是:coll怎么样都获不到值,请各位指教,不胜感激。。。。
  2. A
    你用new WebService()然后addEventListener。最后done方法里也是返回xml的,那里有直接返回泛型list的。

如何用代码方式,建数据库,建表,建索引?

  1. Q
    如何用代码方式,在SQL server7上,建数据库,建表,建索引?

    请给出源码^_^
  2. A
    请到这里看看:http://pbhome.net/info.asp?titleid=18

IIS 中如何发布webservice

  1. Q
    如何在iIS中发布webservice 。其中用vs2010写的web service?
  2. A
    和部署网站一样。

如何用代码方式打开一个本地的网页?

  1. Q
    如何用代码方式打开一个本地的网页?
  2. A
    inet linte 

    GetContextService("Internet", linte) 
    linte.HyperLinkToURL(sle_1.text) 

camel中发布webservice的问题

  1. Q
    camel自带的例子:camel-example-cxf-tomcat

    运行OK。

    但是把WebService接口方法的返回值由对象改为List,
    当然,实现中也调整为返回List。

    但执行错误:
    Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: org.apache.camel.example.cxf.incident.OutputReportIncident cannot be cast to java.util.List

    ~~~~~~~~~~~~~
    同样的,含有List返回值的WebService,如果使用CXF发布和实现,执行正常。
    <jaxws:endpoint id="foo" implementorClass="my.FooImpl" address="/foo" />

    但是调整为camel发布的方式:
    <bean id="fooImpl" class="my.FooImpl"/>
    <camelContext xmlns="http://camel.apache.org/schema/spring">
      <route>
        <from uri="cxf:/foo?serviceClass=my.IFoo"/>
        <to uri="bean:fooImpl"/>
      </route>
    </camelContext>

    就会出现cannot be cast to java.util.List的错误。
    如果把List返回方式改为普通对象,就执行正常。

    有人帮看一下吗?
    多谢!
    问题补充:错误信息发错了:应该是下面的:
    Caused by: java.lang.ClassCastException: org.apache.camel.example.cxf.incident.OutputReportIncident cannot be cast to java.util.List
    at org.apache.camel.example.cxf.incident.jaxws_asm.ReportIncidentResponse_WrapperTypeHelper1.createWrapperObject(Unknown Source)
    at org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:101)

    问题补充:难道是camel CXF Component组件的BUG吗?
    问题补充:代码在:http://dl.iteye.com/topics/download/738cb55e-531d-3852-b00b-86cbe1e43fc2
    因为上传文件太大,我去掉了Spring的JAR包。

    问题补充:改动总共3处:
    1、IncidentService类:
        List<OutputReportIncident> reportIncident(InputReportIncident input);
    2、CamelRoute类:
        List result = new ArrayList();
        result.add(output);
        exchange.getOut().setBody(result);
    3、CamelRouteClient类:
        OutputReportIncident out = client.reportIncident(input).get(0);

    问题补充:有点奇怪的是,错误信息变成了(??):

    java.lang.IllegalArgumentException: Part {http://incident.cxf.example.camel.apache.org/}return should be of type [Lorg.apache.camel.example.cxf.incident.OutputReportIncident;, not org.apache.camel.example.cxf.incident.OutputReportIncident
    at org.apache.cxf.jaxb.io.DataWriterImpl.checkPart(DataWriterImpl.java:221)
  2. A
    我试了下,你这个错误不是camel,也不是cxf的,而是jaxb的错误。jaxb解析的时候,是需要被解析对象添加了jaxb的注解:(@XmlRootElement)
    如果你想返回List,可以把list的值放到对象中,然后通过对象获取list列表。
    这是我的测试代码,如下:
            OutputReportIncident output = new OutputReportIncident();
            output.setCode("OK;");
            List<OutputReportIncident> result = new ArrayList<OutputReportIncident>(); 
            result.add(output); 
            
            JAXBContext context;
    		try {
    			context = JAXBContext.newInstance(ArrayList.class);
    	        Marshaller marshaller = context.createMarshaller();
    	        marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
    	        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    	        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
    	        marshaller.marshal(result, new File("d:/test.xml"));
    		} catch (JAXBException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    

    这样的代码运行错误信息为:
    unable to marshal type "java.util.ArrayList" as an element because it is missing an @XmlRootElement annotation]

    而cxf是封装了这样的错误

客户端使用何种方式调用webservice服务?

  1. Q
    知道了wsdl地址,因为参数都是基本类型,所以使用javax.xml.soap 包下的api自己发送SOAP消息,解析响应数据 。
    但速度是相当的慢!!
    如果使用xfire或axis2等webservice框架效率会不会有所提升?
    有没有不是基于XML实现的、效率比较高的webservice调用方式?
    各位前辈提提意见,小子先行谢过客户端使用何种方式调用webservice服务?

    问题补充:elicer 写道首先你现在的service client 是基于JAX-RPC 还是 JAX-WS的,建议你使用基于JAX-WS的client ,会方便很多,效率也会高点。 当然使用一些比较成熟的框架对使用性,性能方便也会有所帮助,比如CXF(和spring整合会方便一点),axis2.

    关于不是基于XML的webservice , 有建议你看下最新的基于JAX-RS的webservice,Restful webservice (http://cxf.apache.org/docs/jax-rs.html) . 基于Jax-ws的webservice 可以让你指定数据传输格式,支持的传输格式有 xml, jason, String.......
    弱弱的问一句:无论如何发布的服务 ,只要知道了wsdl地址,在客户端可以使用socket,Hessian,REST,SAAJ...方式调用服务吗?
    问题补充:elicer 写道引用弱弱的问一句:无论如何发布的服务 ,只要知道了wsdl地址,在客户端可以使用socket,Hessian,REST,SAAJ...方式调用服务吗?

    虽说他们都是SOA架构的一种实现方式,socket, Hessian 可以call的, REST不行,对rest 来说没有WSDL的概念,它只有资源的概念。
    谢谢你的回答,有种恍然大悟的感觉!
    不过因为对Hessian 不熟,找了点资料说:
    服务器端必须具备以下几点:
        ·包含Hessian的jar包
      ·设计一个接口,用来给客户端调用
      ·实现该接口的功能
      ·配置web.xml,配好相应的servlet
      ·对象必须实现Serializable 接口
      ·对于复杂对象可以使用Map的方法传递


    是不是没这几个条件就无法使用Hessian 调用了?
  2. A
    引用谢谢你的回答,有种恍然大悟的感觉!
    不过因为对Hessian 不熟,找了点资料说:
    服务器端必须具备以下几点:
        ·包含Hessian的jar包
      ·设计一个接口,用来给客户端调用
      ·实现该接口的功能
      ·配置web.xml,配好相应的servlet
      ·对象必须实现Serializable 接口
      ·对于复杂对象可以使用Map的方法传递

    是不是没这几个条件就无法使用Hessian 调用了?
    通常我们不建议使用hessian call 基于 SOAP/HTTP 标准的 Web 服务,因为hessian 是基于Binary-RPC协议实现,效率比SOAP的XML方式要高.
    但是通过使用 WebSphere DataPower 是可以实现 Hessian 客户端访问基于 SOAP/HTTP 标准的 Web 服务的(http://www.ibm.com/developerworks/cn/education/webservices/ws-datapower-hessian/index.html).

试用main方法发布webservice遇到的问题

  1. Q

    我初学webservice,按照书上的例子自己敲了一个Demo。
    如下:

    package server.soap.bobo.net.bean;
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "Student")
    public class Student
    {
        private String name;
        private int age;
        private String sex;
        public String getName()
        {
            return name;
        }
        public void setName(String name)
        {
            this.name = name;
        }
        public int getAge()
        {
            return age;
        }
        public void setAge(int age)
        {
            this.age = age;
        }
        public String getSex()
        {
            return sex;
        }
        public void setSex(String sex)
        {
            this.sex = sex;
        }
    }
    
     
    package server.soap.bobo.net.service;
    
    import javax.jws.WebService;
    
    import server.soap.bobo.net.bean.Student;
    
    @WebService
    public interface IStudentService
    {
        public Student selectMaxAgeStudent(Student stu1 , Student stu2);
    }
    
     

    实现类:

    package server.soap.bobo.net.service.impl;
    
    import server.soap.bobo.net.bean.Student;
    import server.soap.bobo.net.service.IStudentService;
    
    public class StudentServiceImpl implements IStudentService
    {
        @Override
        public Student selectMaxAgeStudent(Student stu1, Student stu2)
        {
            if (stu1.getAge() >= stu2.getAge())
            {
                return stu1;
            }
            else
            {
                return stu2;
            }
        }
        
    }
    

     发布服务:

    package server.soap.bobo.net.server;
    
    
    import javax.xml.ws.Endpoint;
    
    import server.soap.bobo.net.service.impl.StudentServiceImpl;
    
    
    public class SoapServer
    {
        public static void main(String[] args)
        {
            Endpoint.publish("http://127.0.0.1:8040/StudentService" , new StudentServiceImpl());
        }
    }
    

     以上代码是在MyEclipse中编辑的,使用main方法发布,却报NullPointerException:

    Exception in thread "main" java.lang.NullPointerException
    	at com.sun.xml.internal.ws.server.EndpointFactory.getWsdlLocation(EndpointFactory.java:385)
    	at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.getPrimaryWsdl(EndpointImpl.java:265)
    	at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:208)
    	at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:138)
    	at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:90)
    	at javax.xml.ws.Endpoint.publish(Endpoint.java:170)
    	at server.soap.bobo.net.server.SoapServer.main(SoapServer.java:13)
    

     请各位指点一下!


    问题补充:<div class="quote_title">zpchuan 写道</div><div class="quote_div">java.lang.NullPointerException&nbsp;&nbsp;&nbsp; 这不是空指针吗!! <br /> public Student selectMaxAgeStudent(Student stu1, Student stu2) stu1,stu2没实例化.也没无参构造方法</div> <br />不是这样,这是一个web服务,对象实例化由客户端调用程序完成,然后调用我这的服务进行相关的业务处理,我再返回结果,实例化不在我这里。我是要发布web服务!
    问题补充:<div class="quote_title">xydz 写道</div><div class="quote_div">你的代码应该是对,你看下你的环境搭好没.要用CXF</div> <br />我试一下,我是在MyEclipse里面直接建一个Web Service Project工程的。那个还没有试过!
    问题补充:<div class="quote_title">xydz 写道</div><div class="quote_div">你发布服务得要服务器是吧,myeclipse中的ws的框架是xfire,好像只有cxf才能在main里面自定义服务路径吧.去下个CXF,把里面的全部jar粘到你项目的lib中.cxf内置了一个服务器jetty.可以直接通过运行main方法发布服务</div> <br />弄好了,谢谢指点了!
  2. A
    你发布服务得要服务器是吧,myeclipse中的ws的框架是xfire,好像只有cxf才能在main里面自定义服务路径吧.去下个CXF,把里面的全部jar粘到你项目的lib中.cxf内置了一个服务器jetty.可以直接通过运行main方法发布服务

发布webservice

  1. Q
    做了个手持机的项目,手持机是wince系统的,数据库操作写在webservice里面,现在手持机只能插电话卡,连2g网,weservice需要发布到外网手持机才能访问到,求问怎么将webservice发布到外网???求大神帮助
  2. A
    给你设计两个简单的步骤:

    1. 把你的调试时的网站发布到可以被局域网其它机器访问。因此你本地可能使用 http://localhost:2712/default.aspx 来访问,但是你必须先测试用别的电脑,用类似 http://192.168.1.123:2712/default.aspx 这样的方式来访问。也就是说不能用默认的 vs 开发环境的web服务来发布,你可能在需要 IIS 发布。
    2. 即使你的手机在模拟器里,也要直接用你的手机的浏览器去访问上面这个页面。先保证可以访问到。

    在你跑起来手机程序之前,先把网络搞明白。