如何才能創建自定義異常的一些xjc生成類的子類,以便您可以實際拋出它們,並且可以通過JAXBContext來處理?通常,web服務返回定義的各種故障,這些故障實際上應該是一個例外,但由於它們不是你需要不必要地包裝它們。Jaxb Xjc:使異常的生成類子類型?
1
A
回答
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
文件進行配置。
更多信息
- http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html
- http://blog.bdoughan.com/2011/12/eclipselink-moxy-is-jaxb-provider-in.html
更新#2
JAXB參考的最新版本現在似乎可以像MOXy一樣處理這個用例。我原來的可移植性問題可能不是一個問題。
相關問題
- 1. JAXB/XJC:生成子元素類並加載它們基於類的類型
- 2. JAXB/XJC - 從XS生成一個類:組
- 3. XJC生成相同的類
- 4. 讓JAXB XJC產生的包裝類簡單類型
- 5. 在android中使用JAXB(xjc)生成的類
- 6. JAXB - XJC - 影響產生的類型安全枚舉類和成員
- 7. FHIR JAXB XJC代碼生成
- 8. 使用JAXB從架構中嘗試生成類時出錯(xjc)
- 9. 如何使用XJC使用一些現有的Java類生成JAXB類?
- 10. 如何指定用於JAXB xjc生成的類的XmlAccessorType
- 11. JAXB XJC可以抑制生成的類中的註釋創建?
- 12. 如何使用gradle,jaxb和xjc從xsd生成jaxb類應該有XmlRootElement
- 13. JAXB/XJC:生成從元素類具有相同的complexType
- 14. 生成XJC從XSD類
- 15. XJC無法生成* .java類
- 16. 使用JAXB可以生成超類型?
- 17. 問題與XJC生成的類
- 18. JAXB XJC代碼生成 - ObjectFactory類不完整
- 19. JAXB xjc:簡單綁定不會爲基類生成@XmlRootElement
- 20. 使用XJC或xmlBeans生成代理類
- 21. Jaxb生成的類使用JAXBElement而不是指定的類型
- 22. 使用XJC(JAXB)從XML模式定義生成Java類的問題
- 23. 生成多個XSD的Java類XJC
- 24. 如何在使用XJC生成JAXB代碼期間重命名頂級類名?
- 25. 如何製作jaxb-xjc使用的「Exception」類類Throwable?
- 26. JAXB XJC代碼生成 - 由Marshaller生成的xml中缺少「schemaLocation」
- 27. 使用Axis2生成異常類
- 28. JAXB:如何在XSD中指定attr類型時更改XJC生成的類名稱?
- 29. JAXB,XJC - >創建多個類文件
- 30. 與JAXB(XJC)在Java bean類轉換
感謝您的回答!您對普通的JDK6是正確的。在我們的項目中奇怪的是JAXBContext.newInstance沒有拋出(可能是因爲我們包含了一些XML庫)。因此,在我們的設置中,您可以重寫getStackTrace()以返回null,然後您可以成功編組和解組異常。 (也許人們也可以爲StacktraceElement編寫一個XmlAdapter,以避免在普通JDK6上出現這個問題。)所以問題仍然是如何使xjc子類成爲自定義的異常類型。 –
@hstoerr - 您可能正在使用MOXy作爲您的JAXB提供程序(請參閱我的更新)。 –
對於我目前的JAXB提供者來說,它無論如何都可以工作,但我毫不猶豫地使用了一個不可移植的解決方案。您是否看到了將XmlAdapter配置爲StacktraceElement(應該被忽略)或其他方法來避免普通JDK6上出現此問題的方法?我沒有管理。 :-( –