2012-03-26 3 views
1

Java 개체, 즉 DTO에 매핑해야하는 XML이 있습니다. 내 XML 내 DTO의 모든 자바 객체가없는 일부 래퍼 요소가 .. 내 XML이Jaxb 및 XMLPath를 사용하여 XML을 언 마샬 할 수 없습니다.

<UseCaseView> 
<FindCandidates> 
    <CandidatesRequest> 
     <APIRequest> 
      <Code>Code</Code> 
     </APIRequest> 
    </CandidatesRequest> 
</FindCandidates> </UseCaseView> 

은 "FindCandidates"와 "CandidatesRequest는"단지 래퍼 요소처럼 뭔가 "APIRequest는"다시 외모 DTO .. ​​

내가 .. 내 DTO이 같은 XMLPath을 사용하고 내 DTO는 다음과 같습니다 ..

@XmlRootElement(name = "UseCaseView") 
public class FindRequestDTO implements Serializable{ 

private static final long serialVersionUID = 5528726225975606325L; 

private ApiRequestDTO apiRequest; 


@XmlPath("FindCandidates/CandidatesRequest/APIRequest") 
public ApiRequestDTO getAPIRequest() { 
    return apiRequest; 
    ......... 

나는 두 래퍼를 제거 할 경우, 내 ApiRequestDTO에 APIRequest 요소를 매핑하지 않습니다 요소 및 지도를 사용하여 직접 XMLElement (이름 = "APIRequest")는 그것을 작동 ...하지만 난이 Jaxb.properties 내 자원 폴더에

"javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory" 

에 파일을 추가 한 .. 두 래퍼 요소를 무시하고 내 DTO를 구성해야합니다.

사람은 .. 여기에 잘못가는 뭐죠 나를 알고

덕분에,

+0

: 네이티브 API를 사용하는 경우에는 jaxb.properties 파일이 필요하지? 다음 예는 도움이 될 수 있습니다. https : //github.com/bdoughan/blog20110908. 그렇지 않으면 내일 답변을 게시 할 것입니다. –

+0

@Blaise - 빠른 답장을위한 thx .. 반환되는 구현 클래스는 com.sun.xml.bind.v2.runtime.JAXBContextImpl입니다. – sampath

+0

클래스 경로에 eclipselink.jar가 있습니까? 이전 코멘트에서 링크 된 예제는 Maven을 사용하여 컴파일하고 실행하는 모든 설정입니다. –

답변

2

참고 도움이 될 수 있습니다을 나는 EclipseLink JAXB (MOXy) 리드와 JAXB 2 (JSR-222) 전문가 그룹의 구성원입니다.

다음은 도움이되는 완전한 예제입니다.

jaxb.properties

는 도메인 모델과 동일한 패키지에 다음과 같은 항목으로 jaxb.properties을라는 파일을 추가 할 필요가 당신의 JAXB 공급자로 MOXY을 지정합니다.

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory 

FindRequestDTO

package forum9881188; 

import java.io.*; 
import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.*; 

@XmlRootElement(name = "UseCaseView") 
public class FindRequestDTO implements Serializable { 

    private static final long serialVersionUID = 5528726225975606325L; 

    private ApiRequestDTO apiRequest; 

    @XmlPath("FindCandidates/CandidatesRequest/APIRequest") 
    public ApiRequestDTO getAPIRequest() { 
     return apiRequest; 
    } 

    public void setAPIRequest(ApiRequestDTO apiRequest) { 
     this.apiRequest = apiRequest; 
    } 

} 

ApiRequestDTO

package forum9881188; 

public class ApiRequestDTO { 
} 

데모

package forum9881188; 

import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(FindRequestDTO.class); 

     FindRequestDTO fr = new FindRequestDTO(); 
     fr.setAPIRequest(new ApiRequestDTO()); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(fr, System.out); 
    } 

} 
,536 91,363,210

세부 정보

대 출력

<?xml version="1.0" encoding="UTF-8"?> 
<UseCaseView> 
    <FindCandidates> 
     <CandidatesRequest> 
     <APIRequest/> 
     </CandidatesRequest> 
    </FindCandidates> 
</UseCaseView> 

17,451,515,


UPDATE

어떤 이유로 JAXBContext의 MOXY 구현을 얻을 수없는 경우, 당신은 항상 부트 스트랩 네이티브 API를 사용할 수 있습니다. 당신은`JAXBContext`가 반환되는 구현 클래스 무엇을 만들 때

package forum9881188; 

import javax.xml.bind.*; 
import org.eclipse.persistence.jaxb.JAXBContextFactory; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     //JAXBContext jc = JAXBContext.newInstance(FindRequestDTO.class); 
     JAXBContext jc = JAXBContextFactory.createContext(new Class[] {FindRequestDTO.class}, null); 

     FindRequestDTO fr = new FindRequestDTO(); 
     fr.setAPIRequest(new ApiRequestDTO()); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(fr, System.out); 
    } 

} 
+0

내가 업데이트 솔루션을 시도하면 Groovy.lang.MissingMethodException : 메소드의 시그니처가 없음 : 정적 org.eclipse.persistence.jaxb.JAXBContextFactory.createContext()는 인수 유형에 적용 가능합니다. ([Ljava.lang.Object ;, null) 값 : [[ 클래스 CommonSvcRs], null] 가능한 해결책 : createContext ([Ljava.lang.Class], java.util.Map), createContext (java.lang.String, java.lang.ClassLoader), createContext ([Ljava.lang.Class , java.util.Map, java.lang.ClassLoader), createContext ([Ljava.lang.reflect.Type], [java.util.Map], [java.lang.ClassLoader]), ... – Norm212