使用CXF的EndPoint发布WebService报异常:
Exception in thread "main" org.apache.cxf.service.factory.ServiceConstructionException
at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:238)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:313)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:362)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:156)
at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:89)
at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:74)
at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:108)
at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:147)
at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:299)
at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:230)
at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:181)
at org.apache.cxf.jaxws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:74)
at javax.xml.ws.Endpoint.publish(Endpoint.java:240)
at com.fei.ServerStart_bad.deployService(ServerStart_bad.java:14)
at com.fei.ServerStart_bad.main(ServerStart_bad.java:19)
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
@XmlAttribute/@XmlValue need to reference a Java type that maps to text in XML.
this problem is related to the following location:
at private java.util.HashMap com.fei.webservice.user.bean.ZInfo.map
at com.fei.webservice.user.bean.ZInfo at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:66)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:389)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:236)
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:76)
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:432)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
at org.apache.cxf.jaxb.JAXBDataBinding.createJAXBContext(JAXBDataBinding.java:427)
at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:221)
... 14 more
是在Service创建一个方法,服务端返回一个Map对象给客户端。自定义了服务端的接口,对这个函数的定义为:

@XmlJavaTypeAdapter(MapAdapter.class)
public Map<String, String> getPersonMap();

上面注解中的MapAdapter是自定义的传唤工具,代码为:
 
public class MapAdapter extends XmlAdapter<MapConvertor, Map<String, Object>> {
    @Override
    public MapConvertor marshal(Map<String, Object> map) throws Exception {
        MapConvertor convertor = new MapConvertor();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            MapConvertor.MapEntry e = new MapConvertor.MapEntry(entry);
            convertor.addEntry(e);
        }
        return convertor;
    }
 
    @Override
    public Map<String, Object> unmarshal(MapConvertor map) throws Exception {
        Map<String, Object> result = new HashMap<String, Object>();
        for (MapConvertor.MapEntry e : map.getEntries()) {
            result.put(e.getKey(), e.getValue());
        }
        return result;
    }
}

其中使用的MapConvertor定义为:
 
@XmlType(name = "MapConvertor")
@XmlAccessorType(XmlAccessType.FIELD)
public class MapConvertor {
    private List<MapEntry> entries = new ArrayList<MapEntry>();
 
    public void addEntry(MapEntry entry) {
        entries.add(entry);
    }
 
    public List<MapEntry> getEntries() {
        return entries;
    }
     
    public static class MapEntry {
 
        private String key;
 
        private Object value;
         
        public MapEntry() {
            super();
        }
 
        public MapEntry(Map.Entry<String, Object> entry) {
            super();
            this.key = entry.getKey();
            this.value = entry.getValue();
        }
 
        public MapEntry(String key, Object value) {
            super();
            this.key = key;
            this.value = value;
        }
 
        public String getKey() {
            return key;
        }
 
        public void setKey(String key) {
            this.key = key;
        }
 
        public Object getValue() {
            return value;
        }
 
        public void setValue(Object value) {
            this.value = value;
        }
    }
}

这样发布这个服务就报异常了。请问,这种自定义CXF里WebService对象传输的转换类,应该如何定义呢?