2012-10-11 26 views
1

如何才能創建自定義異常的一些xjc生成類的子類,以便您可以實際拋出它們,並且可以通過JAXBContext來處理?通常,web服務返回定義的各種故障,這些故障實際上應該是一個例外,但由於它們不是你需要不必要地包裝它們。Jaxb Xjc:使異常的生成類子類型?

回答

1

是的,我終於找到了一些東西! Inheritance plugin能夠使生成的類從類繼承或實現其他接口。

您需要包括像

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

到綁定文件並覆蓋的getStackTrace()返回空值,使得它不會整理。

不幸的是,您可能會遇到一些JAXB實現問題(請參閱Blaise Doughan's answer) - 我還沒有找到解決方法。因此,您可以使用一個不太重要的解決方案,或者將JAXB對象包裝爲Exceptions。

2

即使您可以創建一個從Exception擴展的JAXB (JSR-222)模型,您也無法從中創建JAXBContext。我建議將Exception包裝在與JAXB兼容的域模型中。

Java模型(美孚)

下面是擴展Exception一個簡單的Java類。下面

package forum12840627; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Foo extends Exception { 

} 

演示

演示代碼試圖在Java模型創建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文件進行配置。

更多信息

更新#2

JAXB參考的最新版本現在似乎可以像MOXy一樣處理這個用例。我原來的可移植性問題可能不是一個問題。

+0

感謝您的回答!您對普通的JDK6是正確的。在我們的項目中奇怪的是JAXBContext.newInstance沒有拋出(可能是因爲我們包含了一些XML庫)。因此,在我們的設置中,您可以重寫getStackTrace()以返回null,然後您可以成功編組和解組異常。 (也許人們也可以爲StacktraceElement編寫一個XmlAdapter,以避免在普通JDK6上出現這個問題。)所以問題仍然是如何使xjc子類成爲自定義的異常類型。 –

+0

@hstoerr - 您可能正在使用MOXy作爲您的JAXB提供程序(請參閱我的更新)。 –

+0

對於我目前的JAXB提供者來說,它無論如何都可以工作,但我毫不猶豫地使用了一個不可移植的解決方案。您是否看到了將XmlAdapter配置爲StacktraceElement(應該被忽略)或其他方法來避免普通JDK6上出現此問題的方法?我沒有管理。 :-( –

相關問題