我一直無法重現您正在使用的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;
}
}
感謝您的回覆如此之快並經過測試。 我嘗試以不同的方式使用AdjustVolume的新類重新映射,現在它會拾取該元素。 我發現我的DecibelValueAdapter導致了問題,但是失敗了。當它是一個簡單的字符串值時,它就會出現。 我懷疑解析器假定失敗意味着該值根本不存在。這是默認行爲嗎?我沒有看到任何警告。 – 2012-08-14 15:09:33
@JohnBaker - 默認是對士兵。根據JSR-222用戶組的經驗,我們決定在文檔中與映射不匹配的所有內容都失敗會導致JAXB無法使用。您可以在'Marshaller'和'Unmarshaller'上設置'ValidationEventHandler'的實例來處理髮生的故障。 – 2012-08-14 15:17:57
如果我升級到2.4.1以上,以下映射停止工作 - 爲空。有任何想法嗎? @XmlPath( 「參數[名= '量']」) – 2015-04-14 08:18:54