JAX - WS: 배후 기술 JAXB 및 전달 지도
12221 단어 xmlJAXBwebserviceAdapterjaxws
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 의 전달 이 완 료 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
XML이란 무엇입니까?이것은 저장, 검색 및 공유할 수 있는 형식으로 데이터를 저장하는 강력한 방법입니다. 가장 중요한 것은 XML의 기본 형식이 표준화되어 있기 때문에 시스템이나 플랫폼 간에 로컬 또는 인터넷을 통해 XML을 공유하거나...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.