Es konnte kein JAXBContext erstellt werden, der meine WSDL erstellt

Ich versuche, meine WSDL für Webservices zu generieren, aber ich erhalte diesen Fehler:

 Hinweis: eine Runde: 2
 Ausnahme im Thread "main" javax.xml.ws.WebServiceException: JAXBContext kann nicht erstellt werden
         unter com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext (AbstractSEIModelImpl.java:153)
         bei com.sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess (AbstractSEIModelImpl.java:83)
         unter com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel (RuntimeModeler.java:244)
         unter com.sun.tools.internal.ws.wscompile.WsgenTool.buildModel (WsgenTool.java:229)
         unter com.sun.tools.internal.ws.wscompile.WsgenTool.run (WsgenTool.java:112)
         bei sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Methode)
         bei sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39)
         bei sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25)
         bei java.lang.reflect.Method.invoke (Methode.java:597)
         unter com.sun.tools.internal.ws.Invoker.invoke (Invoker.java:105)
         bei com.sun.tools.internal.ws.WsGen.main (WsGen.java:41)
 Verursacht von: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 Anzahl von IllegalAnnotationExceptions
 java.lang.StackTraceElement verfügt nicht über einen Standardkonstruktor ohne Argumente.
         Dieses Problem betrifft den folgenden Speicherort:
                 bei java.lang.StackTraceElement
                 bei public java.lang.StackTraceElement [] java.lang.Throwable.getStackTrace ()
                 bei java.lang.Throwable
                 bei java.lang.Exception
                 bei java.sql.SQLException
                 an private java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException
                 bei wsdb.jaxws.SQLExceptionBean

         bei java.security.AccessController.doPrivileged (Native Methode)
         unter com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext (AbstractSEIModelImpl.java:140)
         ... 10 mehr
 Verursacht von: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 zählt IllegalAnnotationExceptions
 java.lang.StackTraceElement verfügt nicht über einen Standardkonstruktor ohne Argumente.
         Dieses Problem betrifft den folgenden Speicherort:
                 bei java.lang.StackTraceElement
                 bei public java.lang.StackTraceElement [] java.lang.Throwable.getStackTrace ()
                 bei java.lang.Throwable
                 bei java.lang.Exception
                 bei java.sql.SQLException
                 an private java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException
                 bei wsdb.jaxws.SQLExceptionBean

         unter com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException $ Builder.check (IllegalAnnotationsException.java:91)
         unter com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet (JAXBContextImpl.java:436)
         unter com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl. (JAXBContextImpl.java:277)
         unter com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl $ JAXBContextBuilder.build (JAXBContextImpl.java:1100)
         unter com.sun.xml.internal.bind.v2.ContextFactory.createContext (ContextFactory.java:143)
         unter com.sun.xml.internal.bind.api.JAXBRIContext.newInstance (JAXBRIContext.java:95)
         unter com.sun.xml.internal.ws.developer.JAXBContextFactory $ 1.createJAXBContext (JAXBContextFactory.java:97)
         bei com.sun.xml.internal.ws.model.AbstractSEIModelImpl $ 1.run (AbstractSEIModelImpl.java:148)
         bei com.sun.xml.internal.ws.model.AbstractSEIModelImpl $ 1.run (AbstractSEIModelImpl.java:140)
         ... 12 mehr

Ich sah ein paar Diskussionen im Internet über dies beginnen mit einem Konstruktor für alle classn erstellen, bis eine andere XML-Spezifikation erstellen. Die Wahrheit ist, es gibt keine echte Antwort für diese oder die Lösungen, die ich testen, funktioniert nicht.

Ich habe hier eine Diskussion über dieses Problem gelesen, aber es war nicht abgeschlossen und ich weiß nicht, wie ich es lösen soll. Wenn jemand eine Ahnung davon hat, würde ich mich freuen, mich in die richtige Richtung zu bringen, um dies zu vermeiden.

Ich verwende Debian Squezze, Java 1.6_20, JAX-WS JAX-WS RI 2.1.6 in JDK 6 und wsgen, um die WSDL zu generieren. Der erste Schritt, den es korrigiert hat, erzeugt das jaxws-Verzeichnis mit Bean-classn.

Throwable Objekte ( Throwable Exceptions und Fehler) können nicht direkt übertragen werden, da sie nicht in XML serialisiert werden können (das StackTraceElement verfügt nicht über einen Konstruktor, der von JAXB benötigt wird).

Sie müssen dafür SOAP-Fehler verwenden. Siehe diese Frage . Sie verweist auf die Annotation @WebFault die Sie in Ihre Ausnahmeklasse @WebFault sollten. (Überprüfen Sie auch dies und das )

Domenic D. hatte die richtige Antwort, die für mich funktionierte, aber ich möchte es weiter ausführen.

Mein Maven-Projekt hat mit JDK 6 gut funktioniert, aber als ich JDK 1.7 als Standard verwendete, brach der Build ab. Durch Hinzufügen einer expliziten Jaxb-Impl-Abhängigkeit w / version funktionierte es wie folgt:

  org.jvnet.jax-ws-commons jaxws-maven-plugin 2.1   com.sun.xml.bind jaxb-impl 2.2.6     ...    

Zur Version: Dieser Fehler ist unter https://java.net/jira/browse/JAXB-814 aufgeführt . Es ist für die Versionen 2.2.4u2, 2.2.5, 2.3 festgelegt

Ich habe dieses Problem getriggers, indem ich die jaxb-impl-Version von 2.1.9 auf 2.2.6 repariere und es funktioniert jetzt gut

  com.sun.xml.bind jaxb-impl 2.2.6  

Es sieht so aus, als ob ein Teil Ihrer deklarierten API einen Typ enthält, der einen Typ mit einem internen Feld vom Typ StackTraceElement [] erweitert.

Da StackTraceElement keinen Nullargumentkonstruktor hat, kann JAXB Instanzen dieser class nicht deserialisieren.

Versuchen Sie, das nextException-Feld von SQLExceptionBean zu entfernen, oder entfernen Sie Parameter des Typs SQLExceptionBean von Ihren Dienst-APIs.

Es ist bekannt, dass jede Exception / Throwable-class von JAXB nicht gemarshallt werden kann, da StackTrace keinen Standardkonstruktor hat. Was Sie tun können, ist Ihre eigene Exception-class zu erstellen, die sich von say in Ihrem Beispiel WebServiceException erstreckt. Überschreiben Sie in Ihrer class die Methoden, die StackTrace verwenden würden, und fügen @XmlTransient ihnen die Annotation @XmlTransient hinzu. Solange Sie JAXB 2.2.4u2 + verwenden, wird der Marshaller der Annotation @XmlTrasient in Ihrer benutzerdefinierten class @XmlTrasient .

Weitere Details finden Sie unter http://java.net/jira/browse/JAXB-814 , das den Fehler beschreibt, bei dem @XmlTransient bei Unterklassen nicht gut funktioniert hat.

Unten ist eine Beispielklasse, die richtig marshall wird:

 package com.stackoverflow.7232331; import javax.ws.rs.core.Response.Status; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @XmlRootElement public class CustomException extends RuntimeException { /** * */ private static final long serialVersionUID = -672804070691541883L; protected String reason; protected Status status; protected int errorCode; public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } public int getErrorCode() { return errorCode; } public void setErrorCode(int errorCode) { this.errorCode = errorCode; } public CustomException(Status status, String message, String reason, int errorCode) { super(message); this.reason = reason; this.status = status; this.errorCode = errorCode; } public CustomException() { super(); } @XmlTransient @Override public StackTraceElement[] getStackTrace() { return super.getStackTrace(); } @XmlTransient @Override public Throwable getCause() { return super.getCause(); } } 

Wenn Sie Maven verwenden, benötigen Sie diese Abhängigkeit:

  com.sun.xml.bind jaxb-impl 2.2.5  

Beachten Sie, dass Sie keine benutzerdefinierte Ausnahme erstellen müssen. Sie müssen nur die richtige Version von JAXB verwenden, wenn Sie Ihre classn generieren. Beispielsweise:

  org.codehaus.mojo jaxws-maven-plugin 1.12   com.sun.xml.bind jaxb-impl 2.2.5     ...    

Ich hatte dieses Problem auch! GENAU die gleiche!

SEHE DIESER FEHLER,

  at java.lang.StackTraceElement at public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace() at java.lang.Throwable at java.lang.Exception at java.sql.SQLException at private java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException at wsdb.jaxws.SQLExceptionBean 

Ich ging meinen Code durch und überprüfte den Grund dafür

  @WebMethod(operationName = "reportnewplace") public String reportnewplace(@WebParam(name = "xcmc") String xcmc, @WebParam(name = "address") String address, @WebParam(name = "lon") String lon, @WebParam(name = "lat") String lat, @WebParam(name = "UID") String UID) throws SQLException{ 

Eine Webmethode sollte keine Exception auslösen, remove triggers dieses Problem einfach, wenn Sie darauf bestehen, folgen Sie der ersten Antwort von @Bozho.

Ich habe dieses Problem getriggers, indem ich ein SOAPBinding auf meiner Oberfläche hinzugefügt habe:

 public interface xxxWebServiceImpl { @SOAPBinding(style = SOAPBinding.Style.RPC) }