Java MOXy Dynamicx JAXB上下文解组到错误的属性名称

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

我当前正在尝试使用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">
    <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);
    }

}