JAXB XMLID 및 XMLIDREF 주석 (Java 스키마)
문제
CXF를 사용하여 웹 서비스를 노출하고 있습니다. 나는 마샬링/unmarshalling 동안 객체 그래프의 참조 무결성을 유지하기 위해 @xmlid 및 @xmlidref jaxb 주석을 사용하고 있습니다.
WSDL에는 xs : id 및 xs : idref 속성이있는 요소가 포함되어 있습니다.
서버 측면에서 모든 것이 정말 잘 작동합니다. @xmlidref로 주석이 달린 유형의 인스턴스는 @xmlid 주석으로 주석이 달린 인스턴스와 동일한 인스턴스입니다.
그러나 wsdltojava로 클라이언트를 생성 할 때 참조 (@xmlidref로 주석이 달린 참조)는 java.lang.object 유형입니다.
참조 유형이 java.lang.string (참조 유형의 ID와 일치 함)이거나 참조 된 유형 자체와 동일하도록 JAXB 바인딩을 사용자 정의 할 수있는 방법이 있습니까?
해결책 3
좋아, 그래서 이것은 작동하지 않을 것입니다. 스키마가 참조 유형을 지정할 수없고 IDREF가 다른 복잡한 유형을 가리키는 것이있을 수 있기 때문에 JAXB가 IDREF에 대한 올바른 유형으로 코드를 생성 할 수 없습니다. JAXB는 참고 문헌의 유형이 무엇인지 어떻게 알 수 있습니까? XML 스키마로의 확장이 가능합니다! :)
다른 팁
인라인 JAXB 바인딩을 사용하여 사용할 유형을 표시하십시오. 그런 다음 JAXB 생성 코드는 올바른 유형을 갖습니다.
<complexType name="Column">
<sequence>
<element name="name" type="string" maxOccurs="1" minOccurs="1"></element>
<element name="referencedColumn" type="IDREF" maxOccurs="1" minOccurs="0">
<annotation>
<appinfo>
<jaxb:property>
<jaxb:baseType name="Column"/>
</jaxb:property>
</appinfo>
</annotation>
</element>
</sequence>
<attribute name="id" type="ID" use="required"></attribute>
</complexType>
또한 선언해야합니다 jaxb
네임 스페이스 및 JAXB 버전 schema
요소.
<schema targetNamespace="http://example.com/schema"
elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="1.0">
다음은 XS : IDREF의 요소/속성에 대한 적어도 문자열 속성을 만드는 것으로 보입니다. 좋은 시작이지만 이상적으로 JAXB는 참조되는 요소와 동일한 유형의 속성을 생성합니다. 어떻게 해야하는지 확인하면 다시보고하겠습니다. 이 결과는 수치심이 될 내 자신의 변환기를 작성해야한다는 것을 나타낼 수 있습니다.
<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:globalBindings>
<jxb:javaType name="java.lang.String" xmlType="xs:IDREF" parseMethod="javax.xml.bind.DatatypeConverter.parseString" printMethod="javax.xml.bind.DatatypeConverter.printString" />
</jxb:globalBindings>
</jxb:bindings>