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