문제

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top