Java MOXy Dynamicx JAXB上下文解组到错误的属性名称
我当前正在尝试使用MOXy中的DynamicAXBContext解组以下XML文件:Java MOXy Dynamicx JAXB上下文解组到错误的属性名称,java,binding,jaxb,moxy,Java,Binding,Jaxb,Moxy,我当前正在尝试使用MOXy中的DynamicAXBContext解组以下XML文件: <?xml version="1.0" encoding="UTF-8"?> <request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://somehost.com/schema_schedule_request.xsd"> <head
<?xml version="1.0" encoding="UTF-8"?>
<request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://somehost.com/schema_schedule_request.xsd">
<header>
<originator>MySatelliteCompany</originator>
<recipient>Recipient</ recipient>
<schedule_valid_from>2008-12-17T00:00:00Z</schedule_valid_from>
<schedule_valid_to>2008-12-18T00:00:07Z</schedule_valid_to>
<request_reference>HGT4285T3</request_reference>
<generation_time>2008-12-16T08:24:00Z</generation_time>
</header>
<body>
<schedule_request>
<start_time>2008-12-17T09:30:47Z</start_time>
<end_time>2008-12-17T09:33:47Z</end_time>
<satellite_name>MySat</satellite_name>
</schedule_request>
</body>
</request>
它可以工作,但动态创建的Java类的属性与XML中给定的字段不对应。例如:被解组为卫星名称。这使得为我的后端API编写自定义绑定文件变得相当困难,因为我必须首先将所有XML文件解组为输入,并手动写下相应的属性名称,或者编写另一个帮助程序应用程序来完成这项工作
是否有任何方法可以更改此MOXy行为,使其正确解组XML中的字段名
补充:
所以我在MOXy文档中找到了原因:
在元数据复杂类型名称、元素名称、,
属性名称将根据
附录D:将XML名称绑定到Java中描述的算法
XML绑定JAXB 2.2的Java体系结构标识符
规格。-更多信息,请访问:
但我的主要问题仍然是:有没有办法关闭或修改此行为?您的添加是正确的,MOXy没有解组错误的属性名称,它只是解组与生成的类中映射的属性/字段名称相对应的属性名称
解决方案应该是什么
binding.xml
JAXB中Java命名规则的默认XML模式是删除。您可以提供一个绑定文件来改变这种行为
演示
使用MOXy的动态JAXB,下面是一个如何利用绑定文件的示例
导入java.io.File;
导入java.util.*;
导入javax.xml.bind.*;
导入javax.xml.transform.stream.StreamSource;
导入org.eclipse.persistence.DynamicEntity;
导入org.eclipse.persistence.jaxb.DynamicJAXBContextFactory;
公开课演示{
公共静态无效主字符串[]args引发异常{
StreamSource schemaSource=new StreamSourcesrc/forum20146935/schema.xsd;
映射属性=新的HashMap1;
properties.putDynamicJAXBContextFactory.EXTERNAL_BINDINGS_KEY,新StreamSourcesrc/forum20146935/binding.xml;
JAXBContext jc=DynamicJAXBContextFactory.createContextFromXSDschemaSource,null,Demo.class.getClassLoader,属性;
Unmarshaller Unmarshaller=jc.createUnmarshaller;
文件xml=newfilesrc/forum20146935/input.xml;
DynamicEntity root=DynamicEntity unmarshaller.unmarshalxml;
System.out.printlroot.getfoo_bar;
}
}
为什么不起作用
正如我前面提到的,MOXy将基于XJC生成的相应映射字段/属性来创建动态属性名称。这与属性名具有u但对应的映射字段没有类似
@XmlElement(name = "foo_bar", required = true)
protected String fooBar;
public String getFoo_Bar() {
return fooBar;
}
public void setFoo_Bar(String value) {
this.fooBar = value;
}
你能做些什么
使用转换后的密钥名。
您可以在MOXy JAXBContext上使用getValueByXPath功能以更类似XML的方式与对象交互
import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.jaxb.JAXBHelper;
import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory;
public class Demo {
public static void main(String[] args) throws Exception {
StreamSource schemaSource = new StreamSource("src/forum20146935/schema.xsd");
Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(DynamicJAXBContextFactory.EXTERNAL_BINDINGS_KEY, new StreamSource("src/forum20146935/binding.xml"));
JAXBContext jc = DynamicJAXBContextFactory.createContextFromXSD(schemaSource, null, Demo.class.getClassLoader(), properties);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum20146935/input.xml");
DynamicEntity root = (DynamicEntity) unmarshaller.unmarshal(xml);
String fooBar = JAXBHelper.getJAXBContext(jc).getValueByXPath(root, "foo_bar/text()", null, String.class);
System.out.println(fooBar);
}
}