2012-08-13 60 views
1

我不明白爲什麼我下面所做的XmlPath映射出現爲null。我的語法有什麼問題嗎?我在別處使用類似的語法,沒有問題XmlPath使用eclipselink映射問題MOXy

感謝任何線索..約翰

<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; 

回答

0

我一直無法重現您正在使用的EclipseLink 2.4.0發現的問題。以下是我所嘗試過的。

剪輯

你的映射看起來OK。

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文件與下面進入指定莫西爲您的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); 
    } 

} 

輸出

下面是距離Runn輸出演示代碼。請注意,只有來自輸入的映射部分出現在輸出中。

<?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> 

支持文件

下面是使這個例子運行所需要的文件的其餘部分:

StoryElement

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)); 
    } 

} 

TIMEVALUE

package forum11937980; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class TimeValue { 

    @XmlValue 
    private String value; 

} 

TimeValueAdapter

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; 
    } 

} 
+0

感謝您的回覆如此之快並經過測試。 我嘗試以不同的方式使用AdjustVolume的新類重新映射,現在它會拾取該元素。 我發現我的DecibelValueAdapter導致了問題,但是失敗了。當它是一個簡單的字符串值時,它就會出現。 我懷疑解析器假定失敗意味着該值根本不存在。這是默認行爲嗎?我沒有看到任何警告。 – 2012-08-14 15:09:33

+0

@JohnBaker - 默認是對士兵。根據JSR-222用戶組的經驗,我們決定在文檔中與映射不匹配的所有內容都失敗會導致JAXB無法使用。您可以在'Marshaller'和'Unmarshaller'上設置'ValidationEventHandler'的實例來處理髮生的故障。 – 2012-08-14 15:17:57

+0

如果我升級到2.4.1以上,以下映射停止工作 - 爲空。有任何想法嗎? @XmlPath( 「參數[名= '量']」) – 2015-04-14 08:18:54