Jaxb 有没有一种方法可以使用MOXy从类生成XML绑定文件?

Jaxb 有没有一种方法可以使用MOXy从类生成XML绑定文件?,jaxb,moxy,Jaxb,Moxy,我想使用MOXy从现有类封送/取消封送对象 我想知道是否有办法从我的类生成XML绑定文件(因为我不想使用注释) 或者我们必须用我们的小手来完成这一切:)?默认情况下,JAXB/MOXy不需要指定任何元数据(请参阅:)。您只需要指定要覆盖默认行为的元数据 我猜您真正的问题是创建MOXy外部映射文档的最简单方法是什么。我使用Eclipse执行以下操作,对于您喜爱的IDE可能有类似的步骤: 获取MOXy映射文档的XML架构 <EclipseLink_Home>/xsds/eclipseli

我想使用MOXy从现有类封送/取消封送对象

我想知道是否有办法从我的类生成XML绑定文件(因为我不想使用注释)


或者我们必须用我们的小手来完成这一切:)?

默认情况下,JAXB/MOXy不需要指定任何元数据(请参阅:)。您只需要指定要覆盖默认行为的元数据

我猜您真正的问题是创建MOXy外部映射文档的最简单方法是什么。我使用Eclipse执行以下操作,对于您喜爱的IDE可能有类似的步骤:

  • 获取MOXy映射文档的XML架构

    <EclipseLink_Home>/xsds/eclipselink_oxm_2_5.xsd
    
    /xsds/eclipseelink_oxm_2_5.xsd
    
  • 在IDE中注册XML模式

  • Eclipse |首选项| XML | XML目录|添加
  • 在IDE中创建XML文档并指定以下内容作为根元素

    <xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"/>
    
    
    
  • 使用IDE提供的自动完成功能来构造XML文档


  • 另一个选项是生成jaxb类,并从这些类中读取生成外部映射的绑定(注释)(之后可以删除注释)。PoC代码:

        public class MoxyBindingGenerator {
        private static final String PACKAGE = "com.company.binding.jaxbclasses";
        private static ObjectFactory xmlBindingsFactory = new ObjectFactory();
    
        public static void main(String[] args) throws Exception {
            Collection<TypeInfo> typeInfos = readAnnotations();
    
            XmlBindings xmlBindings = xmlBindingsFactory.createXmlBindings();
            xmlBindings.setPackageName(PACKAGE);
    
            JavaTypes javaTypes = xmlBindingsFactory.createXmlBindingsJavaTypes();
            xmlBindings.setJavaTypes(javaTypes);
            List<JavaType> javaTypesList = javaTypes.getJavaType();
    
            XmlEnums xmlEnums = xmlBindingsFactory.createXmlBindingsXmlEnums();
            xmlBindings.setXmlEnums(xmlEnums);
            List<XmlEnum> xmlEnumsList = xmlEnums.getXmlEnum();
    
            typeInfos.stream().forEach(typeInfo -> {
                if (!typeInfo.isEnumerationType()) {
                    fillJavaTypes(javaTypesList, typeInfo);
                }
                else {
                    fillEnumTypes(xmlEnumsList, typeInfo);
                }
            });
    
            saveToFile(xmlBindings);
        }
    
        private static Collection<TypeInfo> readAnnotations() throws JAXBException, Exception {
            JAXBContext jaxbContext = (JAXBContext) javax.xml.bind.JAXBContext.newInstance(PACKAGE);
            Object contextState = getPrivateField(jaxbContext, "contextState");
            Generator generator = (Generator) getPrivateField(contextState, "generator");
            AnnotationsProcessor annotationsProcessor = generator.getAnnotationsProcessor();
            Collection<TypeInfo> typeInfos = annotationsProcessor.getTypeInfo().values();
            return typeInfos;
        }
    
        private static void fillEnumTypes(List<XmlEnum> xmlEnumsList, TypeInfo typeInfo) {
            EnumTypeInfo et = (EnumTypeInfo) typeInfo;
    
            XmlEnum xmlEnum = xmlBindingsFactory.createXmlEnum();
            xmlEnum.setJavaEnum(et.getJavaClassName());
            List<String> xmlEnumNames = et.getFieldNames();
            List<Object> xmlEnumValues = et.getXmlEnumValues();
            for (int i = 0; i < xmlEnumNames.size(); i++) {
                String xmlEnumName = xmlEnumNames.get(i);
                Object xmlEnumObject = xmlEnumValues.get(i);
    
                XmlEnumValue xmlEnumValue = xmlBindingsFactory.createXmlEnumValue();
                xmlEnumValue.setJavaEnumValue(xmlEnumName);
                xmlEnumValue.setValue(xmlEnumObject.toString());
                xmlEnum.getXmlEnumValue().add(xmlEnumValue);
            }
            xmlEnumsList.add(xmlEnum);
        }
    
        private static void fillJavaTypes(List<JavaType> javaTypesList, TypeInfo typeInfo) {
            JavaType javaType = xmlBindingsFactory.createJavaType();
            javaType.setName(typeInfo.getJavaClassName());
            fillXmlType(javaType, typeInfo);
            if (typeInfo.getXmlRootElement() != null) {
                XmlRootElement xmlRootElement = typeInfo.getXmlRootElement();
                xmlRootElement.setNamespace(null);
                javaType.setXmlRootElement(xmlRootElement);
            }
            JavaAttributes javaAttributes = xmlBindingsFactory.createJavaTypeJavaAttributes();
            javaType.setJavaAttributes(javaAttributes);
            List<JAXBElement<? extends JavaAttribute>> javaAttributeList = javaAttributes.getJavaAttribute();
            typeInfo.getNonTransientPropertiesInPropOrder().stream().forEach(field -> {
                fillFields(javaAttributeList, field);
            });
            javaTypesList.add(javaType);
        }
    
        private static void fillFields(List<JAXBElement<? extends JavaAttribute>> javaAttributeList, Property field) {
            if (field.getXmlElements() != null && field.getXmlElements().getXmlElement().size() > 0) {
                XmlElements xmlElements = xmlBindingsFactory.createXmlElements();
                xmlElements.setJavaAttribute(field.getPropertyName());
                List<XmlElement> elements = field.getXmlElements().getXmlElement();
                elements.stream().forEach(e -> {
                    e.setDefaultValue(null);
                    e.setNamespace(null);
                    xmlElements.getXmlElement().add(e);
                });
                JAXBElement<XmlElements> value = xmlBindingsFactory.createXmlElements(xmlElements);
                javaAttributeList.add(value);
            }
            else if (!field.isAttribute()) {
                XmlElement value = xmlBindingsFactory.createXmlElement();
                value.setJavaAttribute(field.getPropertyName());
                value.setName(field.getSchemaName().getLocalPart());
                if (field.isNillable())
                    value.setNillable(field.isNillable());
                if (field.isRequired())
                    value.setRequired(field.isRequired());
                javaAttributeList.add(xmlBindingsFactory.createXmlElement(value));
            }
            else {
                XmlAttribute value = xmlBindingsFactory.createXmlAttribute();
                value.setJavaAttribute(field.getPropertyName());
                value.setName(field.getSchemaName().getLocalPart());
                javaAttributeList.add(xmlBindingsFactory.createXmlAttribute(value));
            }
        }
    
        private static void saveToFile(XmlBindings xmlBindings)
                throws JAXBException, PropertyException, FileNotFoundException, IOException {
            JAXBContext xmlModelJaxbContext =
                (JAXBContext) javax.xml.bind.JAXBContext.newInstance("org.eclipse.persistence.jaxb.xmlmodel");
            JAXBMarshaller marshaller = xmlModelJaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            FileOutputStream fos = new FileOutputStream(new File(System.getProperty("user.home"), "binding-imspoor-oxm.xml"));
            marshaller.marshal(xmlBindings, fos);
            fos.close();
        }
    
        private static void fillXmlType(JavaType javaType, TypeInfo typeInfo) {
            XmlType orgXmlType = typeInfo.getXmlType();
            if (orgXmlType != null) {
                boolean add = false;
                XmlType xmlType = xmlBindingsFactory.createXmlType();
                if (!StringUtils.isEmpty(orgXmlType.getName())) {
                    xmlType.setName(orgXmlType.getName());
                    add = true;
                }
                if (orgXmlType.getPropOrder() != null && orgXmlType.getPropOrder().size() > 1) {
                    xmlType.getPropOrder().addAll(orgXmlType.getPropOrder());
                    add = true;
                }
                if (add)
                    javaType.setXmlType(xmlType);
            }
        }
    
        private static Object getPrivateField(Object obj, String fieldName) throws Exception {
            Field declaredField = obj.getClass().getDeclaredField(fieldName);
            declaredField.setAccessible(true);
            return declaredField.get(obj);
        }
    }
    
    公共类MoxyBindingGenerator{
    私有静态最终字符串包=“com.company.binding.jaxbclasses”;
    私有静态ObjectFactory xmlBindingsFactory=新ObjectFactory();
    公共静态void main(字符串[]args)引发异常{
    集合typeInfos=readAnnotations();
    XmlBindings XmlBindings=xmlBindingsFactory.createXmlBindings();
    setPackageName(包);
    JavaTypes JavaTypes=xmlBindingsFactory.createXmlBindingsJavaTypes();
    setJavaTypes(javaTypes);
    List javaTypesList=javaTypes.getJavaType();
    XmlEnums XmlEnums=xmlBindingsFactory.createXmlBindingsXmlEnums();
    setXmlEnums(xmlEnums);
    List xmlEnumsList=xmlEnums.getXmlEnum();
    typeInfos.stream().forEach(typeInfo->{
    如果(!typeInfo.isEnumerationType()){
    fillJavaTypes(javaTypesList、typeInfo);
    }
    否则{
    fillEnumTypes(xmlEnumsList,typeInfo);
    }
    });
    saveToFile(xmlBindings);
    }
    私有静态集合readAnnotations()引发JAXBEException,异常{
    JAXBContext JAXBContext=(JAXBContext)javax.xml.bind.JAXBContext.newInstance(包);
    Object contextState=getPrivateField(jaxbContext,“contextState”);
    生成器生成器=(生成器)getPrivateField(上下文状态,“生成器”);
    AnnotationsProcessor AnnotationsProcessor=generator.getAnnotationsProcessor();
    集合typeInfos=annotationsProcessor.getTypeInfo().values();
    返回typeInfos;
    }
    私有静态void fillEnumTypes(列表xmlEnumsList、TypeInfo TypeInfo){
    EnumTypeInfo et=(EnumTypeInfo)typeInfo;
    XmlEnum XmlEnum=xmlBindingsFactory.createXmlEnum();
    setJavaEnum(et.getJavaClassName());
    列表xmlEnumNames=et.getFieldNames();
    列出xmlEnumValues=et.getXmlEnumValues();
    对于(int i=0;i