JAX - WS: 배후 기술 JAXB 및 전달 지도

JAX - WS 는 복잡 한 대상 전달 의 대부분 을 직접 지원 한다.서버 에서 사용자 정의 복잡 한 대상 Person 을 전 달 했 습 니 다.
public class Person implements Serializable {
    private static final long serialVersionUID = 8336803120311071811L;

    private String            username;
    private Date              birthday;
    private List<Address>     addresses;
//getter/setter

wsimport 에서 생산 된 클 라 이언 트 의 Person 정의 에 따라
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "person", propOrder = {
    "addresses",
    "birthday",
    "username"
})
public class Person {

    @XmlElement(nillable = true)
    protected List<Address> addresses;
    @XmlSchemaType(name = "dateTime")
    protected XMLGregorianCalendar birthday;
    protected String username;
//getter/setter
}

생산 된 클 라 이언 트 코드 에 annotation 성명 이 많이 생 겼 습 니 다. 앞에서 말 했 듯 이 JAX - WS 는 xml 을 바탕 으로 전달 하 는 웹 서비스 입 니 다. 즉, 전달 하 는 매개 변 수 를 xml 문서 로 바 꿔 야 합 니 다. 그 중에서 전환 하 는 과정 은 바로 우리 가 본 클 라 이언 트 대상 에서 각종 annotation 성명 입 니 다. 그 뒤의 기술 은 바로 앞에서 말 한 JAXB (Java Architecture for XML Binding) 입 니 다.쉽게 말 해 JAVA 대상 과 XML 을 서로 전환 하 는 기술 이다.패키지 javax. jwjavax. xml. bid 에 포 함 된 일련의 해 조 를 제공 합 니 다. 컴 파일 이 실 행 될 때 연 결 된 APIjavax. xml. bid. annotation 정 의 는 자바 프로그램 요 소 를 XML 모드 로 맞 춤 형 으로 표시 하 는 주석 javax. xml. bid. annotation. adapters XmlAdapter 와 그 규범 에 따라 정 의 된 하위 클래스 를 JAXB 와 함께 사용 할 수 있 도록 합 니 다.
---------------------------------------- 
주요 인터페이스 또는 클래스:
HandlerChain 은 웹 서 비 스 를 외부 에서 정의 한 프로세서 체인 과 연결 합 니 다.원 웨 이 는 주어진 @ WebMethod 에 입력 메시지 만 있 고 출력 이 없습니다.웹 메 서 드 는 웹 서 비 스 를 위 한 공개 적 인 방법 을 만 들 었 습 니 다.웹 Param 은 웹 서비스 메시지 부분 과 XML 요소 의 매 핑 관 계 를 단일 매개 변수 로 설정 합 니 다.WebResult 는 WSDL 부분 과 XML 요소 의 맵 관 계 를 맞 춥 니 다.웹 서 비 스 는 자바 류 를 웹 서 비 스 를 실현 하 는 것 으로 표시 하거나 자바 인 터 페 이 스 를 웹 서비스 인터페이스 로 정의 합 니 다.
 
Element 이것 은 원소 표기 인터페이스 다.Marshaller Marshaller 류 는 자바 콘 텐 츠 트 리 를 XML 데이터 로 정렬 하 는 과정 을 관리 합 니 다.  Unmarshaller Unmarshaller 클래스 관 리 는 XML 데 이 터 를 새로 만 든 자바 콘 텐 츠 트 리 로 역 정렬 하 는 과정 을 관리 하고 그룹 을 풀 때 XML 데 이 터 를 선택 적 으로 검증 할 수 있 습 니 다.Unmarshaller Handler 가 SAX ContentHandler 로 구현 한 Unmarshaller.ValidationEvent 이 이 벤트 는 그룹 작업 을 수행 하 는 동안 들 어 오 는 XML 데 이 터 를 검증 할 때 자바 콘 텐 츠 트 리 를 필요 에 따라 검증 하거나 자바 콘 텐 츠 트 리 를 XML 데이터 로 컴 파일 할 때 문제 가 발생 하 는 것 을 표시 합 니 다.Datatype Converter 는 자바 Type 바 인 딩 성명 을 사용 하여 XML 모드 데이터 형식 을 자바 데이터 형식 으로 바 인 딩 할 수 있 습 니 다.JAXBCContext JAXBCContext 류 는 JAXB API 의 클 라 이언 트 입구 점 에 제공 합 니 다.XmlAdapter 사용자 정의 컴 파일 에 적응 하기 위해 자바 형식 을 수정 합 니 다.
 
주요 Annotation
XmlAccessorOrder  클래스 의 필드 와 속성의 정렬 을 제어 합 니 다.XmlAccessorType  기본 적 인 상황 에서 필드 나 Javabean 속성 을 계열 화 할 지 여 부 를 제어 합 니 다.XmlAttribute   자바 빈 속성 을 XML 속성 에 매 핑 합 니 다.XmlElement   속성 이름 에 파생 된 XML 요소 에 자바 빈 속성 을 표시 합 니 다.XmlElementWrapper  포장 XML 표시 형식의 포장 기 요 소 를 생 성 합 니 다.XmlList    목록 의 간단 한 형식 에 속성 을 표시 합 니 다.XmlMimeType   관련 제어 속성 XML 표시 형식의 MIME 형식 입 니 다.  XmlRootElement   XML 요소 에 클래스 나 매 거 진 형식 을 표시 합 니 다.XmlTransient   자바 빈 속성 을 XML 표시 형식 에 비 추 는 것 을 막 습 니 다.XmlType   XML 모드 형식 에 클래스 나 매 거 진 형식 을 표시 합 니 다.XmlValue   simpleContent 가 있 는 XML 모드 의 복잡 한 형식 이나 XML 모드 의 간단 한 형식 에 클래스 를 비 추 는 것 을 지원 합 니 다.
 
1. 어떻게 디 코딩
JAXBCContext 는 JAXB API 의 클 라 이언 트 입구 로 자바 에서 xml 로 의 상호 전환 에 대응 하 는 Marshaller 와 Unmarshaller 입 니 다.간단 한 예 는?
JAXBContext jaxbContext = JAXBContext.newInstance(claszz);
Marshaller marshaller = jaxbContext.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "utf-8");
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://sws.org/sample");

marshaller.marshal(t, System.out);
marshaller.marshal(t, new File("c:\\t.xml"));

 여 기 는 자바 가 xml 로 전환 하 는 예 일 뿐 입 니 다.포맷 출력, encoding 등 속성, schema 등 정 보 를 설정 하고 콘 솔 과 지정 한 파일 경 로 를 출력 합 니 다. 
 
2. 자주 사용 하 는 annotation 은 바 인 딩 속성, 바 인 딩 순서, 포맷 처리 등 여러 가지 속성 을 바 인 딩 하 는 데 사 용 됩 니 다.상용
@ XmlRootElement (name = ", namespace =") 는 xml 로 표 시 된 루트 노드 로 최상 위 클래스 나 매 거 진 형식 에 자주 사 용 됩 니 다.다음 설명 과 함께 사용: XmlType, XmlEnum, XmlAccessorType, XmlAccessorOrder.xml 를 생산 하 는 루트 노드 로 서 이름 은 name 을 통 해 지정 할 수 있 습 니 다. 기본 값 은 이 종류 입 니 다.
@ XmlAccessorType (XmlAccessType. FIELD) 은 자바 빈 에 대한 접근 방식 을 제어 합 니 다. 보통 PROPERTY (getter / setter), FIELD, PUBLIC 가 있 습 니 다.MEMBER (public getter / setter, fileds), NONE 는 가방, 최상 위 클래스 에 사용 할 수 있 습 니 다.가방 에 있 는 모든 클래스 가 이 상태 로 처 리 됨 을 나타 내 는 데 사 용 될 경우, 맨 위 클래스 는 다른 실체 가 있 으 면 이 상태 로 처 리 됩 니 다. 기본 값 은 @ XmlAccessorType (XmlAccessType. PUBLIC MEMBER) 입 니 다.
@ XmlAccessorOrder (XmlAccessOrder. ALPHABETICAL) 지정 직렬 화 javabean 순서
@XmlElement@XmlElement설명 은 다음 프로그램 요소 와 함께 사용 할 수 있 습 니 다: 자바 빈 속성, 비 static, 비 transient 필드, XmlElements 의 프로그램 요소
 @XmlElement(name = "firstName")
 private String name;
 private int age;

만약 최상 위 클래스 에 접근 형식 이 표시 되 어 있다 면, 예 를 들 어 Filed.그러면 각 fileds 의 이름 은 xml 의 노드 로 처 리 됩 니 다. 위 에 표 시 된 대로 하면 노드 이름 은 firstName 입 니 다.
  <firstName>nico</firstName>
  <age>20</age>

@ XmlTransient @ XmlTransient 주석 은 자바 빈 속성 이름과 필드 이름 간 의 이름 충돌 을 해결 하거나 필드 / 속성의 맵 을 방지 하 는 데 사 용 됩 니 다.
 @XmlTransient
 private String lastName;

lastName 이 비치 지 않 습 니 다
@ XmlList @ XmlList 는 목록 의 간단 한 형식 에 속성 을 표시 합 니 다.두 가지 시퀀스 비교 하기:            
 List<String> data;       
<foo><data>aaaa</data><data>bbbb</data></foo>
            
@XmlList       
List<String> data;
<foo><data>aaaa bbbb</data></foo>

@ XmlJavaTypeAdapter (class) 는 사용자 정의 adapter 를 설명 하기 위해 XmlAdapter 를 계승 하여 사용자 정의 직렬 화 된 형식 을 사용 해 야 합 니 다.시간 포맷 출력
 
@XmlValue   simpleContent 가 있 는 XML 모드 의 복잡 한 형식 이나 XML 모드 의 간단 한 형식 에 클래스 를 비 추 는 것 을 지원 합 니 다.쉽게 말 하면 형식 을 지정 할 수 있다.
<msg name="name">robin</msg>

 다음은 Person 의 javabean 입 니 다. 일련의 성명 을 포함 합 니 다.
@XmlRootElement(name = "per")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Person {
    @XmlElement(name = "firstName")
    private String         name;
    @XmlTransient
    private String         lastName;
    @XmlJavaTypeAdapter(value = DateXmlAdapter.class)
    private Date           birthDay;
    @XmlList
    private List<String>   lang;

    private List<KeyValue> msg;
//getter/setter
}

 그 중에서 DateXmlAdapter 는 다음 과 같 습 니 다.
public class DateXmlAdapter extends XmlAdapter<String, Date> {

    @Override
    public String marshal(Date v) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 
        return format.format(v);
    }

    @Override
    public Date unmarshal(String v) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 
        return format.parse(v);
    }

}

 KeyValue:
@XmlAccessorType(XmlAccessType.FIELD)
public class KeyValue {

    @XmlAttribute
    private String name;
    @XmlValue
    private String value;

직렬 화 결 과 는 다음 과 같다.
Person p = new Person();
p.setName("robin");
p.setLastName("yang");
p.setBirthDay(new Date());
List<String> lang = Arrays.asList(new String[] { "java", "javascript", "python" });
p.setLang(lang);
List<KeyValue> msg = new ArrayList<KeyValue>();
msg.add(new KeyValue("aa", "aaa-value"));
msg.add(new KeyValue("bbb", "bbb-value"));
p.setMsg(msg);
<per>
    <birthDay>2012-11-17</birthDay>
    <lang>java javascript python</lang>
    <msg name="aa">aaa-value</msg>
    <msg name="bbb">bbb-value</msg>
    <firstName>robin</firstName>
</per>


3, JAX - WS 전달 지도
앞에서 복잡 한 대상 을 전달 할 수 있다 고 말 했 을 때 맵 을 지정 하지 않 은 것 은 원생 의 맵 전달 을 지원 하지 않 기 때문이다.전달 이 필요 하 다 면 간단 한 포장 을 해 야 하 며, 위 에서 말 한 XmlJavaTypeAdapter 를 이용 하여 bean 을 xml 로 변환 해 야 합 니 다.아래 의 예 는 맵 인 스 턴 스 를 전달 하 는 것 입 니 다.
@WebService
public interface JaxWsMapService {

    @WebMethod
    public WrapperMapResult getPersonMap();

}

 Wrapper MapResult 는 Map 에 대한 간단 한 패키지 일 뿐 입 니 다.
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class WrapperMapResult {

    private String              message;
    private boolean             success;

    @XmlJavaTypeAdapter(value = MapAdapter.class)
    private Map<String, Person> map;

 그 중에서 가장 중요 한 것 은 MapAdapter 입 니 다.
public class MapAdapter extends XmlAdapter<MapConvertor, Map<String, Person>> {

    @Override
    public Map<String, Person> unmarshal(MapConvertor convertor) throws Exception {
        List<MapEntry> entries = convertor.getEntries();
        if (entries != null && entries.size() > 0) {
            Map<String, Person> map = new HashMap<String, Person>();
            for (MapEntry mapEntry : entries) {
                map.put(mapEntry.getKey(), mapEntry.getValue());
            }
            return map;
        }
        return null;
    }

    @Override
    public MapConvertor marshal(Map<String, Person> map) throws Exception {
        MapConvertor convertor = new MapConvertor();
        for (Map.Entry<String, Person> entry : map.entrySet()) {
            convertor.addEntry(new MapConvertor.MapEntry(entry));
        }
        return convertor;
    }

}

맵 컨버터 가 맵 < String, Person > 을 해석 하 는 데 사용 된다 고 밝 혔 습 니 다.
@XmlType(name="MapConvertor")
@XmlAccessorType(XmlAccessType.FIELD)
public class MapConvertor {

    private List<MapEntry> entries = new ArrayList<MapConvertor.MapEntry>();

    public void addEntry(MapEntry entry) {
        entries.add(entry);
    }

    public List<MapEntry> getEntries() {
        return entries;
    }

    //       Conver Map,    Map<String, Person>
    public static class MapEntry {
        private String key;
        private Person value;

        public MapEntry() {

        }

        public MapEntry(String key, Person person) {
            this.key = key;
            this.value = person;
        }

        public MapEntry(Map.Entry<String, Person> entry) {
            this.key = entry.getKey();
            this.value = entry.getValue();
        }

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }

        public Person getValue() {
            return value;
        }

        public void setValue(Person value) {
            this.value = value;
        }

    }

}

다른 절 차 는 뉴스 import 생산 클 라 이언 트 코드 에 따라 호출 하면 됩 니 다. 이렇게 하면 JAX - WS 에서 map 의 전달 이 완 료 됩 니 다.

좋은 웹페이지 즐겨찾기