|
JavaTM Platform Standard Ed. 6 |
|||||||||
| 앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
| 개요: 필수 | 옵션 | 상세 : 요소 | |||||||||
@Retention (value =RUNTIME )
@Target (value ={FIELD ,METHOD })
public @interface XmlElementRef
JavaBean 프로퍼티을, 프로퍼티의 형태로부터 파생한 XML 요소에 맵 합니다.
사용법
@XmlElementRef 주석은, JavaBean 프로퍼티으로 사용하는지,XmlElementRefs 내로부터 사용할 수 있습니다.
이 주석은, XML 요소명을 JavaBean 프로퍼티에 동적으로 관련짓습니다. JavaBean 프로퍼티이 XmlElement 로 주석 되고 있는 경우, XML 요소명은 정적으로 JavaBean 프로퍼티명으로부터 파생합니다. 그러나, 이 주석이 사용되는 경우, XML 요소명은 실행시에 JavaBean 프로퍼티의 형태의 인스턴스로부터 파생합니다.
public void setTerm(JAXBElement extends Operator>); public JAXBElement extends Operator> getTerm();
XmlElementDecl 로 주석 된 요소 팩토리 메소드는, XML 요소명을 포함한 JAXBElement 인스턴스를 작성하기 위해서 사용됩니다. 요소 프로퍼티에 @XmlElementRef 주석이 존재하는 것은, JavaBean 프로퍼티명으로부터 XML 요소명이 파생하므로 없고,JAXBElement 인스턴스로부터의 요소명이 사용되는 것을 의미합니다.
사용에는 다음의 제약이 있습니다.
JAXBElement 의 경우, @XmlElementRef.name()과 @XmlElementRef.namespace()는, @XmlRegistry 로 주석 된 클래스내의 @XmlElementDecl 주석을 수반하는 요소 팩토리 메소드를 나타낼 필요가 있습니다 (일반적으로, 이 클래스는 schema 컴파일러에 의해 생성되는 ObjectFactory 클래스).
JAXBElement 이외의 경우, 프로퍼티 또는 필드에 의해 참조되는 형태가 XmlRootElement 로 주석 될 필요가 있습니다. XmlElementWrapper ,XmlJavaTypeAdapter .
추가의 일반적인 정보에 대해서는, javax.xml.bind.package javadoc 의 「패키지의 스펙」을 참조해 주세요.
예 1:Ant 태스크의 예
다음의 Java 클래스 계층은, Ant 빌드 스크립트를 모델링 한 것입니다. Ant 태스크는, 클래스 계층내의 1 개의 클래스에 대응하고 있습니다. Ant 태스크의 XML 요소명은, 대응하는 클래스에 대한 @XmlRootElement 주석에 의해 나타납니다.
@XmlRootElement(name="target")
class Target {
// The presence of @XmlElementRef indicates that the XML
// element name will be derived from the @XmlRootElement
// annotation on the type (for e.g. "jar" for JarTask).
@XmlElementRef
List<Task> tasks;
}
abstract class Task {
}
@XmlRootElement(name="jar")
class JarTask extends Task {
...
}
@XmlRootElement(name="javac")
class JavacTask extends Task {
...
}
<! -- XML Schema fragment -->
<xs:element name="target" type="Target">
<xs:complexType name="Target">
<xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element ref="jar">
<xs:element ref="javac">
</xs:choice>
</xs:sequence>
</xs:complexType>
다음에 코드 fragment를 나타냅니다.
Target target = new Target();
target.tasks.add(new JarTask());
target.tasks.add(new JavacTask());
marshal(target);
상기의 코드 fragment는 다음의 XML 출력을 생성합니다.
.... ....
XmlRootElement 를 가지지 않는 Task 를 확장하는 클래스를 가지는 것은 에러가 아닙니다. 그러나, 이것들은 XML 인스턴스에 표시할 수 없습니다 (이것들에는 XML 요소명이 없기 때문입니다).
예 2:XML Schema 치환 그룹 지원
다음의 예는, XML Schema 치환 그룹용의 주석을 나타냅니다. 주석과 ObjectFactory 는, schema로부터 파생합니다.
@XmlElement
class Math {
// The value of type() is
// JAXBElement.class , which indicates the XML
// element name ObjectFactory - in general a class marked
// with @XmlRegistry. (See ObjectFactory below)
//
// The name() is "operator", a pointer to a
// factory method annotated with a
// XmlElementDecl with the name "operator". Since
// "operator" is the head of a substitution group that
// contains elements "add" and "sub" elements, "operator"
// element can be substituted in an instance document by
// elements "add" or "sub". At runtime, JAXBElement
// instance contains the element name that has been
// substituted in the XML document.
//
@XmlElementRef(type=JAXBElement.class, name="operator")
JAXBElement<? extends Operator> term;
}
@XmlRegistry
class ObjectFactory {
@XmlElementDecl(name="operator")
JAXBElement<Operator> createOperator(Operator o) {...}
@XmlElementDecl(name="add", substitutionHeadName="operator")
JAXBElement<Operator> createAdd(Operator o) {...}
@XmlElementDecl(name="sub", substitutionHeadName="operator")
JAXBElement<Operator> createSub(Operator o) {...}
}
class Operator {
...
}
다음에 코드 fragment를 나타냅니다.
Math m = new Math();
m.term = new ObjectFactory(). createAdd(new Operator());
marshal(m);
상기의 코드 fragment는 다음의 XML 출력을 생성합니다.
<math>
<add>...</add>
</math>
XmlElementRefs | 임의 요소의 개요 | |
|---|---|
String |
name
|
String |
namespace
이 파라미터와 name() 가 사용되어, JavaBean 프로퍼티의 XML 요소가 결정됩니다. |
Class |
type
참조되는 Java 형입니다. |
public abstract Class type
값이 DEFAULT.class 의 경우, 형태는 JavaBean 프로퍼티의 형태로부터 추정됩니다.
public abstract String namespace
name() 가 사용되어, JavaBean 프로퍼티의 XML 요소가 결정됩니다.
type() 가 JAXBElement.class 의 경우,namespace() 와 name() 는,XmlElementDecl 를 수반하는 팩토리 메소드를 나타냅니다. XML 요소명은, 팩토리 메소드 XmlElementDecl 주석의 요소명인지, 또는, 그 치환 그룹의 요소가 XML 문서로 치환되었을 경우, 치환 요소에 대한 XmlElementDecl 의 요소명입니다.
type() 가 JAXBElement.class 이외의 경우, XML 요소명은, 형태에 대한 XmlRootElement 주석을 사용해 형태에 정적으로 관련지을 수 있었던 XML 요소명입니다. 형태가 XmlElementDecl 로 주석되어 있지 않은 경우, 에러입니다.
type() 가 JAXBElement.class 이외의 경우, 이 값은 「」이 됩니다.
public abstract String name
namespace()
|
JavaTM Platform Standard Ed. 6 |
|||||||||
| 앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
| 개요: 필수 | 옵션 | 상세 : 요소 | |||||||||
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.