JAXB를 사용하여 스키마 확장 성을 어떻게 보장합니까?
-
05-07-2019 - |
문제
Glassfish V2의 Metro Web Services의 일부로 JAXB를 사용하는 경우 JAXB에 추가하라고 말하는 방법은 다음과 같습니다.
<xsd:any/> and <xsd:anyAttribute/>
내 생성 된 복잡한 유형에 태그가있어 미래에 응답 객체에 요소 나 속성을 추가하기 위해 현재 클라이언트가 깨지지 않도록합니다.
JAXB 문서는 다소 부족한 것 같습니다.
해결책 2
좋아, 이것이 내가 작동하는 방법입니다.
import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
public class SchemaExtensible
{
@XmlAnyElement(lax=true)
private List<Element> otherElements;
@XmlAnyAttribute
private Map<QName,Object> otherAttributes;
}
이제는 확장 가능하고 싶은 모든 응답 클래스에 대해이 클래스를 확장해야하기 때문에 이상적이지 않습니다 (경우에 따라 요청 클래스에서 확장하는 것을 막는 경우). 이 2 가지 방법 및 필드 레벨 주석이 클래스 레벨에서 추가 될 수 있도록 향상 될 수 있다면 단순히 "스키마에 적절한 태그를 추가하고 만나면 데이터를 버리십시오"라고 말할 수 있습니다.
스키마 조각이 다음과 같이 보일 수 있습니다.
<xs:complexType name="SchemaExtensible">
<xs:sequence>
<xs:any processContents="lax" namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="skip"/>
</xs:complexType>
나에게는 응답 객체에 대한이 확장 성을 허용하는 것이 웹 서비스 버전화에만 바람직합니다. 원하는 경우 다양한 버전을 관리하는 두통이없고 기존 클라이언트가 걱정하지 않고 스키마를 비트 단위로 발전시킬 수 있습니다. 응답 개체에 단일 새 속성 또는 요소를 추가하면 파손됩니다.
다른 팁
java.lang.object 유형을 사용하십시오. 기본적으로 JAXB는 XSD를 생성합니다. java.lang.object의 웹 서비스 메소드에서 org.w3c.dom.node 인스턴스를 반환 유형으로 성공적으로 반환했습니다. XSD와 비슷한 것이있을 것입니다 : anyAttribute- 아마도 객체 리턴 유형과 Xmlattribute jaxB 주석을 사용하는 것과 비슷한 것이있을 것입니까?
추가 : 다음 주석은 목표를 달성하는 것처럼 보입니다. 둘 다 JAXB 2.0 사양의 일부입니다.
@xmlanyattribute @xmlanyElement