Java 使用eclipselink MOXy的XmlPath映射问题
我不明白为什么我在下面创建的XmlPath映射会显示为null。我的语法有问题吗?我在其他地方使用了类似的语法,没有问题 谢谢你提供的任何线索。。约翰Java 使用eclipselink MOXy的XmlPath映射问题,java,jaxb,eclipselink,moxy,Java,Jaxb,Eclipselink,Moxy,我不明白为什么我在下面创建的XmlPath映射会显示为null。我的语法有问题吗?我在其他地方使用了类似的语法,没有问题 谢谢你提供的任何线索。。约翰 <clip lane="-1" offset="2591065664/720000s" name="Music" duration="22304160/240000s" start="176794/48000s" enabled="0" format="r5"> <adjust-volume amount="1dB"&g
<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;
@XmlRootElement(name=“clip”)
@XmlAccessorType(XmlAccessType.FIELD)
公共类Clip扩展了StoryElement{
@XmlPath(“调整音量/金额”)
@XmlJavaTypeAdapter(DecibelValueAdapter.class)
私人双卷;
@XmlPath(“调整音量/param[@name='amount']/fadeIn/@duration”)
@XmlJavaTypeAdapter(TimeValueAdapter.class)
私人时间价值;
@XmlPath(“调整音量/参数[@name='amount']/fadeOut/@duration”)
@XmlJavaTypeAdapter(TimeValueAdapter.class)
私有时间值衰减;
我无法重现您在使用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
演示
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);
}
}
输出
下面是运行演示代码的输出。请注意,输出中只显示输入的映射部分
支持文件 下面是运行此示例所需的其余文件: 故事元素 分贝值适配器 TimeValueAdapter
用于UM11937980的包;
导入javax.xml.bind.annotation.adapters.XmlAdapter;
公共类TimeValueAdapter扩展了XmlAdapter{
@凌驾
公共TimeValue封送处理程序(TimeValue v)引发异常{
返回v;
}
@凌驾
公共TimeValue解组(TimeValue v)引发异常{
返回v;
}
}
感谢您如此快速地回复并进行测试。我尝试使用AdjustVolume的新类以不同的方式重新映射,现在它拾取了该元素。我发现我的DecibelValueAdapter导致了问题,但没有提示。当它是一个简单的字符串值时,它会出现。我怀疑解析器假定失败意味着该值不是根本不存在。这是默认行为吗?我没有看到任何警告。@JohnBaker-默认行为是继续。根据JSR-222用户组的经验,我们决定在文档中所有与映射不匹配的地方失败都会导致JAXB不可用。您可以在这两个方面都设置ValidationEventHandler
的实例Marshaller
和Unmarshaller
来处理发生的故障。如果我升级到2.4.1以上,以下映射将停止工作-为空。有什么想法?@XmlPath(“param[name='amount']”)
package forum11937980;
public class StoryElement {
}
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;
}
}