WebService系列中CXF方式(二)
1.设置构建 <dependency> ??? <groupId>org.apache.ws.xmlschema</groupId> ??? <artifactId>xmlschema-core</artifactId> ??? <version>2.0.3</version> </dependency> <dependency> ??? <groupId>org.apache.cxf</groupId> ??? <artifactId>cxf</artifactId> ??? <version>2.6.2</version> </dependency> <dependency> ??? <groupId>org.apache.neethi</groupId> ??? <artifactId>neethi</artifactId> ??? <version>3.0.2</version> </dependency> <dependency> ??? <groupId>wsdl4j</groupId> ??? <artifactId>wsdl4j</artifactId> ??? <version>1.6.2</version> </dependency> <dependency> ??? <groupId>org.apache.geronimo.specs</groupId> ??? <artifactId>geronimo-jaxws_2.2_spec</artifactId> ??? <version>1.1</version> </dependency> <dependency> ??? <groupId>org.apache.geronimo.specs</groupId> ??? <artifactId>geronimo-ws-metadata_2.0_spec</artifactId> ??? <version>1.1.3</version> </dependency>??????? 2.编写服务 @WebService(name = "DataService",targetNamespace = DataServiceConstants.TARGET_NAMESPACE) @WebServiceClient(name = "DataServerService",targetNamespace = DataServiceConstants.TARGET_NAMESPACE) publicinterface DataService { ??? @WebMethod(operationName = "GetTopGroup",action = DataServiceConstants.SOAP_ACTION_PREFIX ?????????? + "GetTopGroup") ??? @WebResult(name = "GetTopGroupResult",partName = "GetTopGroupResult",targetNamespace = DataServiceConstants.TARGET_NAMESPACE) ??? String getTopGroup( ?????????? @WebParam(name = "account",targetNamespace = DataServiceConstants.TARGET_NAMESPACE) String account, ?????????? @WebParam(name = "password",targetNamespace = DataServiceConstants.TARGET_NAMESPACE) String password); } ? 2.1:确认参数在xml文件中名称正确,你需要使用,因为java接口在.class文件中不存储参数名称,所以@WebParam注解是必须的,因此如果你不使用这个注解,参数将被命名为arg0 : @WebParam(name = "account",targetNamespace = DataServiceConstants.TARGET_NAMESPACE) String account; ? 2.2:在实现类上的@WebService注解使CXF知道使用那个接口来创建WSDL,我们示例中是DataService接口 ? 3.发布服务 3.1:简单发布 DataService?? implementor = new DataService();? String address = "http://localhost:9000/DataService";? Endpoint.publish(address,implementor); ? 3.2:你可以添加日志拦截器,进行发布 DataServiceimplementor = new DataService();?? JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();?? svrFactory.setServiceClass(DataService.class);?? svrFactory.setAddress("http://localhost:9000/DataService");?? svrFactory.setServiceBean(implementor);?? svrFactory.getInInterceptors().add(new LoggingInInterceptor());?? svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());?? svrFactory.create(); ? 4.访问服务 JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();?? factory.getInInterceptors().add(new LoggingInInterceptor());?? factory.getOutInterceptors().add(new LoggingOutInterceptor());?? factory.setServiceClass(DataService.class);?? factory.setAddress("http://localhost:9000/DataService");?? DataServiceclient = (DataService) factory.create();?? ? String reply = client.sayHi("HI");?? System.out.println("Server said: " + reply);?? System.exit(0);?? ? 总述:访问服务的同时,可以采用创建型模式中的工厂模式去设计,通过工厂类去创建服务,并访问服务; publicclass DataServiceClientFactory implements FactoryBean<DataService> { ? ??? String address; ? ??? publicvoid setAddress(String address) { ?????? this.address = address; ??? } ? ??? @Override ??? public DataService getObject() throws Exception { ?????? JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); ?????? factory.setServiceClass(DataService.class); ?????? factory.setAddress(address); ?????? if (factory.getProperties() == null) { ?????????? Map<String,Object> properties = new HashMap<String,Object>(); ?????????? factory.setProperties(properties); ?????? } ?????? factory.getProperties().put("set-jaxb-validation-event-handler", ????????????? "false"); ?????? DataService service = (DataService) factory.create(); ?????? return service; ??? } ? ??? @Override ??? public Class<?> getObjectType() { ?????? return DataService.class; ??? } ? ??? @Override ??? publicboolean isSingleton() { ?????? returntrue; ??? } } ? ? 5:spring配置,在spring配置文件中配置要发布的web服务: <beans xmlns:jaxws="http://cxf.apache.org/jaxws"??? xsi:schemaLocation="http://www.springframework.org/schema/beans http://cxf.apache.org/jaxws? http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> ? <jaxws:server id="dataServiceServer" ?????? serviceClass="com.dingli.component.server.dataservice.DataService" ?????? address="http://localhost/DataService"> ?????? <jaxws:serviceBean> ?????????? <ref bean="dataserviceBean" /> ?????? </jaxws:serviceBean> ??? </jaxws:server> ? <!-- 另一种方式endpoint,与server不同的是显示给用户的wsdl不同? <jaxws:endpoint????? id="dataService"???? implementor="com.cxf.impl.DataServiceImpl"???? address="http://localhost/DataService" />?? ? -->? </beans> ? 6:webservice注解详解 jax-ws是java开发webservice的标准API: ? (1).javax.jws中常用的注解: a.@Webservice:将一个类声明为webservice。 b.@Webparam:指定webservice的参数 c.@WebResul:指定webservice的返回值。 d.@WebMethod:指定某个方法为webservice对外提供的方法 ? (2).javax.jws.soap中常用的注解: @SOAPBinding:将某个接口绑定为webservice ? 7:WebService的调用过程: 8.JAXB(java API for XML Bing): JAXB是一种java对象和xml数据格式之间相互转换的API。 (1).JAXB的作用: Java Object ——> JAXB ——> XML (2).JAXB的工作原理: (3).JAXB的常用注解: a.@XmlRootElement:将Java类映射为XML的根节点。 b.@XmlElement:将属性或方法映射为XML的节点。 c.@XmlAccessorType:指明映射那些方法或者字段。 d.@XmlTransient:指明那些方法或者字段不需要和xml进行映射。 e.@XmlJavaTypeAdapter:Xml和Java对象的转换。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |