2012-08-13 2 views
1

아래에서 만든 XmlPath 매핑이 null로 나오지 않습니다. 구문에 문제가 있습니까? 나는 문제없이 다른 곳에서 비슷한 문법을 ​​사용했다. 어떤 단서eclipselink를 사용한 XmlPath 매핑 문제 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을 사용하여보고있는 문제를 재현 할 수 없었습니다. 아래는 내가 시도한 것입니다.

클립

당신의 매핑이 확인 될 것으로 보인다.

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

,
+0

너무 빨리 답장하고 테스트 해 주셔서 감사합니다. AdjustVolume에 대한 새로운 클래스를 사용하여 다른 방식으로 재 매핑하려고 시도했지만 이제는 해당 요소를 선택합니다. 내 DecibelValueAdapter가 문제를 일으키고 있지만 조용히 실패하고 있습니다. 그것이 단순한 String 값일 때 나타납니다. 파서가 실패했다고 가정하는 것은 그 값이 전혀 존재하지 않는다는 것을 의미한다고 생각합니다. 이것이 기본 동작입니까? 나는 어떤 경고도 보지 못했다. –

+0

@ JohnBaker - 기본값은 군인입니다. JSR-222 사용자 그룹의 경험을 바탕으로 우리는 문서에서 매핑과 일치하지 않는 모든 것이 실패하면 JAXB를 사용할 수 없게 만들 것이라고 결정했습니다. 'Marshaller'와'Unmarshaller' 둘 다에'ValidationEventHandler'의 인스턴스를 설정하여 발생하는 실패에 대한 핸들을 얻을 수 있습니다. –

+0

2.4.1 이상으로 업그레이드하면 다음 매핑이 작동을 멈추고 null입니다. 어떤 아이디어? @XmlPath ("param [name = 'amount']") –