CXF 에서 JAXB 데이터 로 맵 형식 지원

4377 단어 자바CXFweb Service

일부 자바 형식 은 xml 로 자 연 스 럽 게 매 핑 되 지 않 습 니 다.예 를 들 어 HashMap 이나 다른 비 자바 Bean 류 는 이 럴 때 XmlAdapter 를 덮어 서 변환 방법 을 정의 할 수 있 습 니 다.
XML 어댑터 설명:
 
javax.xml.bind.annotation.adapters 
클래스 XmlAdapter
 
형식 매개 변수:
BoundType-JAXB 는 어떻게 처리 해 야 할 지 모 르 는 유형 들.ValueType 을 통 해 이 형식 을 메모리 표시 형식 으로 사용 할 수 있 도록 어댑터 를 만 듭 니 다.
ValueType-JAXB 는 다른 조작 없 이 처리 하 는 유형 을 알 수 있 습 니 다.
 
 
도입:
CXF 의 일부 서버 프로그램 이 클 라 이언 트 프로그램 에 호출 될 때 SOAP 에 서 는 Map(클 라 이언 트 가 Map 매개 변 수 를 전달 하거나 서버 에서 Map 데 이 터 를 되 돌려 주 는 것)을 지원 하지 않 습 니 다.그렇지 않 으 면 다음 과 같은 오류 가 발생 합 니 다.Marshalling Error:java.util.Map is not known to this context.
 
원인:
CXF 에 서 는 맵 을 지원 하지 않 습 니 다.
 
해결 방안:
어댑터 를 통 해 배열 을 HashMap 으로 변환 하 는 방식 을 지원 합 니 다.
 
코드 구현:
1、  맵 변환기(code)import java.util.Array List 정의;
import java.util.List;
import java.util.Map;
 
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
 
/**
 * @author TEANA E-mail: [email protected]
 * @version     :2011-7-1   11:21:49
 * @DO      Map           
 */
@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 static class MapEntry
    {
        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;
        }
 
        private String key;
        private Object 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;
        }
    }
 
    public List<MapEntry> getEntries()
    {
        return entries;
    }
}

 2、  맵 어댑터(code)import java.util.HashMap 정의;
import java.util.Map;
 
import javax.xml.bind.annotation.adapters.XmlAdapter;
 
/**
 * @author TEANA E-mail: [email protected]
 * @version     :2011-7-1   11:25:11
 * @DO       Map          
 */
 
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;
    }
}

 3、  CXF 서버 의 인터페이스 프로그램 에서 다음 과 같이 정의 합 니 다@WebMethod 
@XmlJavaTypeAdapter(MapAdapter.class)  
Map<String, String> getMap();

 이 세 단 계 를 거치 면 CXF 에서 맵 에 대한 지원 이 가능 하 다.
 
 
다음으로 이동:http://mmz06.blog.163.com/blog/static/121416962011620339342/

좋은 웹페이지 즐겨찾기