난 당신이는 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 공급자로 MOXY를 지정하려면 다음 항목을 사용하여 도메인 모델과 동일한 패키지에 jaxb.properties 파일이 있습니까?
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 {
}
,515,
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
,
너무 빨리 답장하고 테스트 해 주셔서 감사합니다. AdjustVolume에 대한 새로운 클래스를 사용하여 다른 방식으로 재 매핑하려고 시도했지만 이제는 해당 요소를 선택합니다. 내 DecibelValueAdapter가 문제를 일으키고 있지만 조용히 실패하고 있습니다. 그것이 단순한 String 값일 때 나타납니다. 파서가 실패했다고 가정하는 것은 그 값이 전혀 존재하지 않는다는 것을 의미한다고 생각합니다. 이것이 기본 동작입니까? 나는 어떤 경고도 보지 못했다. –
@ JohnBaker - 기본값은 군인입니다. JSR-222 사용자 그룹의 경험을 바탕으로 우리는 문서에서 매핑과 일치하지 않는 모든 것이 실패하면 JAXB를 사용할 수 없게 만들 것이라고 결정했습니다. 'Marshaller'와'Unmarshaller' 둘 다에'ValidationEventHandler'의 인스턴스를 설정하여 발생하는 실패에 대한 핸들을 얻을 수 있습니다. –
2.4.1 이상으로 업그레이드하면 다음 매핑이 작동을 멈추고 null입니다. 어떤 아이디어? @XmlPath ("param [name = 'amount']") –