일부 xjc 생성 클래스를 사용자 정의 Exception의 하위 클래스로 만들 수 있습니다. 예를 들어, 실제로 사용자가 예외를 throw하고 JAXBContext에서 처리 할 수 있습니까? 웹 서비스는 실제로 예외가되어야하는 다양한 오류를 반환하지만, 불필요하게 다시 감쌀 필요는 없습니다.Jaxb Xjc : 예외의 생성 된 클래스 하위 유형을 만드시겠습니까?
답변
예, 드디어 찾았습니다! 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 객체를 예외로 랩핑 할 수 있습니다.
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
파일을 사용하여 구성 할 수 있습니다. 추가 정보
- 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
UPDATE # 2
JAXB 프로 기준의 최신 버전 구현은 이제 MOXy뿐만 아니라이 사용 사례를 처리하는 것으로 보입니다. 필자의 원래 이식성 문제는 그다지 문제가되지 않을 수도 있습니다.
- 1. JAXB XJC 코드 생성
- 2. XJC 동일한 클래스 생성
- 3. JAXB XJC 코드 생성 - ObjectFactory 클래스가 불완전합니다.
- 4. marshall with xjc 생성 된 중첩 클래스
- 5. JAXB-XJC Xpropertyaccessors
- 6. XJC 생성 네임 스페이스
- 7. XPDL - JAXB 클래스 생성 오류
- 8. Java JAXB XJC 코드 생성 양식 XSD 스키마 문제
- 9. JAXB 생성 클래스 접두사
- 10. jaxb 변환기 도구 사용 xjc
- 11. xjc 클래스 생성 중에 수퍼 클래스가 누락되었습니다. 계층 불일치 오류
- 12. JAXB - XSD에서 클래스 생성 - enum을 문자열로 변환
- 13. JAXB xjc 기존 도메인 객체에 매핑
- 14. JAXB 믹싱 에피소드 및 jar 라이브러리의 xjc : javaType
- 15. JAXB : 개미 작업에 의해 @ 생성 된 소스를 얻는 방법?
- 16. Java App에서 JAXB 생성 클래스 참조하기
- 17. 인터페이스를 구현하는 JAXB 클래스 생성하기
- 18. XJC - Xpath를 사용하여 XML 생성
- 19. 동적으로 생성 된 클래스?
- 20. Netbeans 방지하기 JAXB 생성 쓰레싱 클래스
- 21. JAXB 2 주석 및 하위 클래스 두통
- 22. JAXB - 생성 된 클래스 이름을 사용자 정의하지만 생성하지 못하도록 구성
- 23. IntelliJ : 하위 프로젝트에서 JAXB 생성 클래스를 찾을 수 없습니다.
- 24. Ant의 JAXB 클래스 파일에서 XML 스키마 생성
- 25. JAXB XJC 코드 생성 - Marshaller에서 생성 한 XML에서 "schemaLocation"이 누락되었습니다.
- 26. IOS6에서 UITableviewContrller 예외의 서브 클래스
- 27. Jaxb 클래스 생성 중 패키지 삭제 중 생성 된 Maven 패키지 이름이 올바르지 않습니다.
- 28. JAXB 생성 내에서 객체 생성
- 29. JAXB (xjc)를 사용하여 전역 요소에 POJO를 생성하는 방법은 무엇입니까?
- 30. XJC 다중 XSD -> "에피소드"를 사용하는 클래스 생성
답변 해 주셔서 감사합니다. 당신은 평범한 JDK6에 맞습니다. 이상하게도 우리 프로젝트에서 JAXBContext.newInstance는 던지지 않는다. (우리가 포함하는 몇몇 XML 라이브러리 때문에 눈에 띄지 않는다.) 따라서, 우리 설정에서는 getStackTrace()를 오버라이드하여 null을 리턴 한 다음 예외를 성공적으로 마샬링하고 언 마샬 할 수있다. 아마도 일반 JDK6에서이 문제를 피하기 위해 StacktraceElement 용 XmlAdapter를 작성할 수도 있습니다. 따라서 xjc 서브 클래스를 사용자 정의 예외 유형으로 만드는 방법은 여전히 부족합니다. –
@hstoerr - MOXy를 JAXB 제공 업체로 사용하고있을 수 있습니다 (내 업데이트 참조). –
현재의 JAXB 제공 업체는 어쨌든 작동하지만 비 휴대용 솔루션을 사용하기를 주저합니다. 스택 JDK6에서이 문제를 피하기 위해 StackTraceElement (무시해야만하는) 또는 다른 어떤 것에 XmlAdapter를 구성하는 방법이 있습니까? 나는 그것을 관리하지 않았다. :-( –