【问题标题】:XmlPath mapping problems using eclipselink MOXy使用 eclipselink MOXy 的 XmlPath 映射问题
【发布时间】:2012-08-09 21:35:06
【问题描述】:

我不明白为什么我在下面创建的 XmlPath 映射显示为空。我的语法有问题吗?我在其他地方使用了类似的语法没有问题。

感谢任何线索.. 约翰

<clip lane="-1" offset="2591065664/720000s" name="Music" duration="22304160/240000s" start="176794/48000s" enabled="0" format="r5">
    <adjust-volume amount="1dB">
      <param name="amount">
        <fadeIn type="easeIn" duration="1220/262144s"/>
      </param>
    </adjust-volume>
    <audio ref="r9" name="VoiceOver-26 - audio" duration="4639346/48000s" role="dialogue"/>
</clip>

@XmlRootElement(name = "clip")
@XmlAccessorType(XmlAccessType.FIELD)
public class Clip extends StoryElement {

@XmlPath("adjust-volume/@amount")
@XmlJavaTypeAdapter(DecibelValueAdapter.class)
private Double adjustVolume;

@XmlPath("adjust-volume/param[@name='amount']/fadeIn/@duration")
@XmlJavaTypeAdapter(TimeValueAdapter.class)
private TimeValue fadeIn;

@XmlPath("adjust-volume/param[@name='amount']/fadeOut/@duration")
@XmlJavaTypeAdapter(TimeValueAdapter.class)
private TimeValue fadeOut;

【问题讨论】:

    标签: java jaxb eclipselink moxy


    【解决方案1】:

    我无法重现您在使用 EclipseLink 2.4.0 时看到的问题。以下是我尝试过的。

    剪辑

    您的映射似乎没问题。

    package forum11937980;
    
    import javax.xml.bind.annotation.*;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    
    import org.eclipse.persistence.oxm.annotations.XmlPath;
    
    @XmlRootElement(name = "clip")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Clip extends StoryElement {
    
        @XmlPath("adjust-volume/@amount")
        @XmlJavaTypeAdapter(DecibelValueAdapter.class)
        private Double adjustVolume;
    
        @XmlPath("adjust-volume/param[@name='amount']/fadeIn/@duration")
        @XmlJavaTypeAdapter(TimeValueAdapter.class)
        private TimeValue fadeIn;
    
        @XmlPath("adjust-volume/param[@name='amount']/fadeOut/@duration")
        @XmlJavaTypeAdapter(TimeValueAdapter.class)
        private TimeValue fadeOut;
    
    }
    

    jaxb.properties

    您的域模型所在的包中是否有一个 jaxb.properties 文件,其中包含以下条目以将 MOXy 指定为您的 JAXB 提供程序?

    javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
    

    input.xml

    <clip lane="-1" offset="2591065664/720000s" name="Music" duration="22304160/240000s"
        start="176794/48000s" enabled="0" format="r5">
        <adjust-volume amount="1dB">
            <param name="amount">
                <fadeIn type="easeIn" duration="1220/262144s" />
                <fadeOut duration="I/Added/This"/>
            </param>
        </adjust-volume>
        <audio ref="r9" name="VoiceOver-26 - audio" duration="4639346/48000s"
            role="dialogue" />
    </clip>
    

    演示

    package forum11937980;
    
    import java.io.File;
    import javax.xml.bind.*;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Clip.class);
    
            Unmarshaller unmarshaller = jc.createUnmarshaller();
            File xml = new File("src/forum11937980/input.xml");
            Clip clip = (Clip) unmarshaller.unmarshal(xml);
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(clip, System.out);
        }
    
    }
    

    输出

    下面是运行演示代码的输出。请注意,只有输入中的映射部分出现在输出中。

    <?xml version="1.0" encoding="UTF-8"?>
    <clip>
       <adjust-volume amount="1.0dB">
          <param name="amount">
             <fadeIn duration="1220/262144s"/>
             <fadeOut duration="I/Added/This"/>
          </param>
       </adjust-volume>
    </clip>
    

    支持文件

    以下是运行此示例所需的其余文件:

    故事元素

    package forum11937980;
    
    public class StoryElement {
    
    }
    

    DecibalValueAdapter

    package forum11937980;
    
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    
    public class DecibelValueAdapter extends XmlAdapter<String, Double> {
    
        @Override
        public String marshal(Double v) throws Exception {
            return String.valueOf(v) + "dB";
        }
    
        @Override
        public Double unmarshal(String v) throws Exception {
            return Double.valueOf(v.substring(0, v.length() - 2));
        }
    
    }
    

    时间值

    package forum11937980;
    
    import javax.xml.bind.annotation.*;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    public class TimeValue {
    
        @XmlValue
        private String value;
    
    }
    

    时间值适配器

    package forum11937980;
    
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    
    public class TimeValueAdapter extends XmlAdapter<TimeValue, TimeValue> {
    
        @Override
        public TimeValue marshal(TimeValue v) throws Exception {
            return v;
        }
    
        @Override
        public TimeValue unmarshal(TimeValue v) throws Exception {
            return v;
        }
    
    }
    

    【讨论】:

    • 感谢您如此迅速地回复并进行测试。我尝试使用 AdjustVolume 的新类以不同的方式重新映射,现在它拾取了该元素。我发现我的 DecibelValueAdapter 引起了问题,但默默地失败了。当它是一个简单的字符串值时,它会出现。我怀疑解析器假设失败意味着该值根本不存在。这是默认行为吗?我没有看到任何警告。
    • @JohnBaker - 默认是士兵。根据 JSR-222 用户组的经验,我们决定在文档中与映射不匹配的所有内容上失败会使 JAXB 无法使用。您可以在MarshallerUnmarshaller 上设置ValidationEventHandler 的实例,以处理发生的故障。
    • 如果我升级到 2.4.1 以上,以下映射将停止工作 - 为空。有任何想法吗? @XmlPath("param[name='amount']")
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多