2012-10-11 2 views

답변

1

예, 드디어 찾았습니다! Inheritance plugin은 생성 된 클래스를 클래스에서 상속 받거나 추가 인터페이스를 구현할 수 있습니다.

당신은()가 정렬 화되지 않는 널 (null) 등을 반환 getStackTrace()에을 바인딩 파일에

<bindings node="//xsd:complexType[@name='WhateverException']"> 
    <inheritance:extends>foo.bar.WhateverException</inheritance:extends> 
    </bindings> 

같은 것을 포함 오버라이드 (override) 할 필요가있다.

일부 JAXB 구현에서 문제가 발생할 수 있습니다 (Blaise Doughan's answer 참조). 아직 해결 방법을 찾지 못했습니다. 따라서 당신은 꽤 비싸지 않은 솔루션을 사용하거나 JAXB 객체를 예외로 랩핑 할 수 있습니다.

2

Exception에서 확장 한 JAXB (JSR-222) 모델을 만들 수 있다고해도 JAXBContext을 만들 수 없습니다. Exception을 JAXB와 호환되는 도메인 모델로 래핑하는 것이 좋습니다.

자바 모델 (푸)

아래 Exception를 확장하는 간단한 자바 클래스입니다.

package forum12840627; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Foo extends Exception { 

} 

데모

데모 코드는 아래의 자바 모델에 JAXBContext을 생성하려고 시도합니다.

package forum12840627; 

import javax.xml.bind.JAXBContext; 

public class Demo { 

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

} 

출력 아래

데모 코드를 실행 반환의 예외입니다. 문제는 Exception이 유효한 JAXB 클래스가 아니며 JAXB 구현이 Java 모델을 처리 할 때 수퍼 클래스를 가져 오는 것입니다. (참고 : 자신의 도메인 모델에서 사용하면 처리되는 것을 방지하기 위해 @XmlTransient와 슈퍼 클래스에 주석을 달 수 있습니다 http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html를)

Exception in thread "main" com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
java.lang.StackTraceElement does not have a no-arg default constructor. 
    this problem is related to the following location: 
     at java.lang.StackTraceElement 
     at public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace() 
     at java.lang.Throwable 
     at java.lang.Exception 
     at forum12840627.Foo 

    at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:472) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1140) 
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154) 
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202) 
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:363) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522) 
    at forum12840627.Demo.main(Demo.java:8) 

업데이트 # 1

을 당신은 EclipseLink JAXB를 사용하는 경우 (MOXy)를 JAXB 공급자로 사용하는 경우 javax.*java.* 패키지의 클래스가 도메인 클래스로 처리되지 않으므로이 예외가 표시되지 않습니다. MOXy는 WebLogic 12c 환경의 기본 JAXB 공급자이거나 jaxb.properties 파일을 사용하여 구성 할 수 있습니다. 추가 정보

UPDATE # 2

JAXB 프로 기준의 최신 버전 구현은 이제 MOXy뿐만 아니라이 사용 사례를 처리하는 것으로 보입니다. 필자의 원래 이식성 문제는 그다지 문제가되지 않을 수도 있습니다.

+0

답변 해 주셔서 감사합니다. 당신은 평범한 JDK6에 맞습니다. 이상하게도 우리 프로젝트에서 JAXBContext.newInstance는 던지지 않는다. (우리가 포함하는 몇몇 XML 라이브러리 때문에 눈에 띄지 않는다.) 따라서, 우리 설정에서는 getStackTrace()를 오버라이드하여 null을 리턴 한 다음 예외를 성공적으로 마샬링하고 언 마샬 할 수있다. 아마도 일반 JDK6에서이 문제를 피하기 위해 StacktraceElement 용 XmlAdapter를 작성할 수도 있습니다. 따라서 xjc 서브 클래스를 사용자 정의 예외 유형으로 만드는 방법은 여전히 ​​부족합니다. –

+0

@hstoerr - MOXy를 JAXB 제공 업체로 사용하고있을 수 있습니다 (내 업데이트 참조). –

+0

현재의 JAXB 제공 업체는 어쨌든 작동하지만 비 휴대용 솔루션을 사용하기를 주저합니다. 스택 JDK6에서이 문제를 피하기 위해 StackTraceElement (무시해야만하는) 또는 다른 어떤 것에 XmlAdapter를 구성하는 방법이 있습니까? 나는 그것을 관리하지 않았다. :-( –

관련 문제