source

JAXB에서 JAXB 요소가 필요한 이유와 시기는 무엇입니까?

gigabyte 2023. 7. 18. 23:06
반응형

JAXB에서 JAXB 요소가 필요한 이유와 시기는 무엇입니까?

저는 방금 JAXB(XML Binding을 위한 Java Architecture)를 배우고 있습니다.몇 가지 출처를 통해 읽으며, 한 가지 의심이 제 마음속에 떠올랐습니다.JAXBElement.

Oracle 문서는 다음과 같이 말합니다.

When XML element information can not be inferred by the derived Java representation of the XML content, a JAXBElement object is provided. This object has methods for getting and setting the object name and object value. 여기에 링크

그렇다는 뜻입니까?JAXBElement스키마 정의 데이터 유형과 Java 데이터 유형 사이에 직접 매핑이 없을 때 사용해야 합니까?

또한, 아래에 나열된 코드 예제 중 하나입니다.가 여기서 따라온 것:

 ObjectFactory factory = new ObjectFactory();

    UserT user = factory.createUserT();
    user.setUserName("Sanaulla");
    ItemT item = factory.createItemT();
    item.setItemName("Seagate External HDD");
    item.setPurchasedOn("August 24, 2010");
    item.setAmount(new BigDecimal("6776.5"));

    ItemListT itemList = factory.createItemListT();
    itemList.getItem().add(item);

    ExpenseT expense = factory.createExpenseT();// we get expense object here
    expense.setUser(user);
    expense.setItems(itemList);

    JAXBContext context = JAXBContext.newInstance("generated");
    JAXBElement<ExpenseT> element = factory.createExpenseReport(expense);//why is this required
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty("jaxb.formatted.output",Boolean.TRUE);
    marshaller.marshal(element,System.out);

사용.ExpenseT expense = factory.createExpenseT();우리는 얻을 수 있습니다.ExpenseT물건.

다시 코드에서 우리가 본다면, 우리는 창조합니다.

JAXBElement<ExpenseT> element = factory.createExpenseReport(expense);
출처에 따르면 그것은 포장지입니다.expense물건.
반면에 다음을 사용하여 검색된 개체에 대한 래퍼를 만들지 않습니다.
UserT user = factory.createUserT();

그래서 제 질문은:

  1. 무엇이 필요합니까?JAXBElement을 휘감고 다니다expense?
  2. 사용 시기JAXBElement?

다음과 같은 몇 가지 사용 사례가 있습니다.JAXBElement필수 항목:

  1. 요소는 둘 다입니다.nillable="true"그리고.minOccurs="0"이 경우 무엇을 합니까?null매핑된 필드/메모 평균에서?속성이 다음과 같을 때JAXBElementnull 값은 요소가 존재하지 않으며 aJAXBElementrapping null은 다음을 포함하는 XML 요소를 의미합니다.xsi:nil="true".
  2. 이름이 동일한 복합 유형의 전역 요소가 2개 있습니다.JAXB에서 클래스는 복잡한 유형에 해당하므로 어떤 루트 요소를 만났는지 캡처할 수 있는 방법이 필요합니다.자세한 내용은 제가 작성한 이 기사를 참조하십시오.
  3. 다음 중 하나가 선택되는 구조가 있습니다.foo또는bar요소가 발생할 수 있으며 동일한 유형입니다.여기서JAXBElement단순히 마주치기 때문에 필요합니다.String값이 부족하여 마셜링할 요소를 나타낼 수 없습니다.
  4. 다음을 포함하는 요소xsi:nil속성이 포함된 문서에서 발견되었습니다.이 예에서는 해당 요소에 해당하는 개체를 여전히 제거하여 속성 값을 유지할 수 있지만 JAXBElement는 여전히 요소가 null이었음을 나타낼 수 있습니다.

JAXElement는 객체 모델에 충분한 정보가 없는 사용 사례에서 요소 이름/이름 공간을 보존하는 데 사용됩니다.대체 그룹과 함께 사용되는 경우가 많습니다.

JAXB 메타데이터를 사용하지 않으면 결과가 JAXBE 요소로 포장됩니다.@XmlRootElement 주석을 사용하여 루트 수준 JAXElement를 제거할 수 있습니다.

외부 소스의 xsd 파일을 사용하는 경우 생성된 클래스에서 XmlRootElement 주석을 사용할 수 없는 경우 JAXElement 래퍼를 사용하여 xml을 개체로 마샬링 해제할 수 있으므로 Marshalling 프로세스 중에 JAXElement를 사용하는 것이 유용할 수 있습니다.이 경우 클래스를 지정하는 것 자체가 작동하지 않는다는 것을 알게 될 것입니다.

이렇게 하면 됩니다.

JAXBElement<Object> je = (JAXBElement<Object>) unmarshaller.unmarshal(objectXML);
Object = je.getValue();

그러면 JAXB 예외가 발생합니다.

Object obj = (Object) unmarshaller.unmarshal(objectXML);

언급URL : https://stackoverflow.com/questions/20396375/why-and-when-jaxbelement-is-required-in-jaxb

반응형