Как узнать, требуется ли элемент XSD с помощью MOXy Dynamic JAXB? - PullRequest
1 голос
/ 22 октября 2019

Я пытаюсь получить информацию из XSD, используя MOXY DynamicJAXBContext. Одно из свойств, которые я пытаюсь получить, это если атрибут или элемент обязателен . Из того, что я понимаю, если элемент имеет minOccurs="1", это означает, что требуется .

Проблема в том, что я не нашел способ получить это.

Вот код, который у меня есть до сих пор:

DynamicJAXBContext jaxbContext = 
                DynamicJAXBContextFactory.createContextFromXSD(is, new MyEntityResolver(), null, null);


        Collection<ClassDescriptor> descriptors = jaxbContext.getXMLContext().getSession().getDescriptors().values();
        for (ClassDescriptor desc : descriptors) {
            if (desc.getJavaClassName() != null) {
                System.out.println("=================================");
                System.out.println("Class: " + desc.getJavaClassName());
                desc.getMappings().forEach(dm ->{
                    System.out.println(dm.getAttributeName());

                    System.out.println(dm.getClass().getName());
                    if(dm instanceof XMLDirectMapping) {
                        XMLDirectMapping xmlInfo = (XMLDirectMapping)dm;
                        System.out.println(xmlInfo);
                    }
                    if(dm.getAttributeClassification() != null) {
                        System.out.println(dm.getAttributeClassification().getName());
                    }
                    if(dm.getReferenceDescriptor() != null) {
                        System.out.println(dm.getReferenceDescriptor().getJavaClassName());
                    }
                 });

            }
        }

До сих пор я был в состоянии получить информацию относительно типа атрибута, если это коллекция и тип коллекции.

Я пытался исследовать другие методы переменной dm, включая isOptional() и getField().isNullable(), и оба возвращают true для атрибутов, где minOccurs="1"

1 Ответ

1 голос
/ 22 октября 2019

Я обнаружил, что объект, возвращаемый getField(), на самом деле имеет тип XMLField, который является подклассом общего типа, возвращаемого этим методом DatabaseField. У XMLField есть метод isRequired(), который эффективно возвращает, если требуется атрибут.

 if(dm.getField() instanceof XMLField) {
     XMLField field = (XMLField)dm.getField();
     System.out.println(field.isRequired());
 }
...