Cxf - 转换器

来源:互联网 发布:淘宝中秋节活动时间 编辑:程序博客网 时间:2024/05/15 14:55

一、说明

    对于一些比较复杂的组合类型数据,如如下接口中的getBookGroupByUser()方法:

import java.util.List;import java.util.Map;import javax.jws.WebService;import com.xilen.cxf.entity.Book;import com.xilen.cxf.entity.User;@WebServicepublic interface UserInfoWs {public String sayHello(String name);public List<Book> getBookByUser(User u);public Map<String, Book> getUserRecommBook();public Map<User, List<Book>> getBookGroupByUser();}

    Cxf框架可能因为无法自动解析而在发布时抛出异常:

Exception in thread "main" javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionExceptionat org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:371)at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:251)at org.apache.cxf.jaxws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:155)at javax.xml.ws.Endpoint.publish(Unknown Source)at com.xilen.ServerMain.main(ServerMain.java:14)Caused by: org.apache.cxf.service.factory.ServiceConstructionExceptionat org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:341)at org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean...)at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean...)at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.buildServiceFromClass(JaxWsServiceFactoryBean.java:704)at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean...)at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:265)at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:215)at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory...)at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:159)at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:211)at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:456)at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:334)... 4 moreCaused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptionsjava.util.List is an interface, and JAXB can't handle interfaces.this problem is related to the following location:at java.util.Listat private java.util.Map com.xilen.cxf.ws.jaxws_asm.GetBookGroupByUserResponse._returnat com.xilen.cxf.ws.jaxws_asm.GetBookGroupByUserResponse

    附:两个实体类

public class Book {private Integer id;private String name;private Date date;/*getter and setter */ }
public class User {private Integer id;private String name;private String email;/*getter and setter */}
二、开发

    1、创建Java普通对象,对无法解析的数据类型重新封装。如Map<User, List<Book>>类型的数据,可以做如下封装

        (1)先将Map的一个键值对组成一个新的对象Item

public class Item {private User key;private List<Book> value;public Item() {super();}/* getter and setter */}
        (2)将Item对象以集合类型做为最终转换对象的属性

public class DataSet {private List<Item> item = new ArrayList<Item>();public DataSet() {super();}/* getter and setter */}

    2、开发Cxf转换器。需要继承javax.xml.bind.annotation.adapters.XmlAdapter<ValueType, BoundType>类。ValueType即自定义的数据类型,BoundType即受限制而需要被转换的数据类型

import java.util.HashMap;import java.util.List;import java.util.Map;import javax.xml.bind.annotation.adapters.XmlAdapter;import com.xilen.cxf.entity.Book;import com.xilen.cxf.entity.User;public class MyXmlAdapter extends XmlAdapter<DataSet, Map<User, List<Book>>> {@Overridepublic Map<User, List<Book>> unmarshal(DataSet v) throws Exception {Map<User, List<Book>> maps = new HashMap<User, List<Book>>();for (Item item : v.getItem()) {maps.put(item.getKey(), item.getValue());}return maps;}@Overridepublic DataSet marshal(Map<User, List<Book>> v) throws Exception {DataSet ds = new DataSet();for (User user : v.keySet()) {Item item = new Item(user, v.get(user));ds.getItem().add(item);}return ds;}}
   3、使用这个转换器。使用时通过javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter这个注解修饰需要被转换的接口方法上,并通过Value属性指定转换器

import java.util.List;import java.util.Map;import javax.jws.WebService;import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;import com.xilen.cxf.entity.Book;import com.xilen.cxf.entity.User;import com.xilen.cxf.ws.util.MyXmlAdapter;@WebServicepublic interface UserInfoWs {public String sayHello(String name);public List<Book> getBookByUser(User u);public Map<String, Book> getUserRecommBook();public @XmlJavaTypeAdapter(MyXmlAdapter.class) Map<User, List<Book>> getBookGroupByUser();}

三、附

    1、工程结构图

        

    2、工程源码

        http://download.csdn.net/detail/u013379717/7210625 
 
 




0 0
原创粉丝点击