J'essaie de générer mon WSDL pour les services Web mais j'obtiens cette erreur:
Remarque: ap round: 2 Exception dans le thread "principal" javax.xml.ws.WebServiceException: impossible de créer JAXBContext Sur com.Sun.xml.internal.ws. model.AbstractSEIModelImpl.createJAXBContext (AbstractSEIModelImpl.Java:153) sur com.Sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess (AbstractSEIModelImpl.Java:83) sur com.Sun. xml.internal.ws.model.RuntimeModeler.buildRuntimeModel (RuntimeModeler.Java:244) sur com.Sun.tools.internal.ws.wscompile.WsgenTool.buildModel (WsgenTool.Java:229) sur com.Sun.tools.internal.ws.wscompile.WsgenTool.run (WsgenTool.Java:112) sur Sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) sur Sun.reflect .NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.Java:39) Sur Sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.Java:25) Sur Java.lang.reflect.Method.inava : 597) à com.Sun.tools.internal.ws.Invoker.invoke (Invoker.Java:105) à com.Sun.tools.internal.ws.WsGen.main (WsGen.Java:41) Causée par: Java.security.PrivilegedActionException: com.Sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 décompte des IllegalAnnotationExceptions Java.lang.StackTraceElement n'a pas de constructeur par défaut sans argument . ce problème est lié à l'emplacement suivant: sur Java.lang.StackTraceElement sur public Java.lang.StackTraceElement [] Java.lang.Throwable.getStackTrace () sur Java.lang.Throwable sur Java.lang.Exception sur Java.sql.SQLException sur privé Java.sql.SQLException wsdb.jaxws.SQLExceptionBean. nextException sur wsdb.jaxws.SQLExceptionBean sur Java.security.AccessController.doPrivileged (Native Method) sur com.Sun .xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext (AbstractSEIModelImpl.Java:140) ... 10 plus Provoqué par: com.Sun.xml.internal.bind.v2.runtime .IllegalAnnotationsException: 1 décompte des IllegalAnnotationExceptions Java.lang.StackTraceElement n'a pas de constructeur par défaut sans argument. Ce problème est lié à l'emplacement suivant: À Java.lang .StackTraceElement Sur public Java.lang.StackTraceElement [] Java.lang.Throwable.getStackTrace () Sur Java.lang.Throwable Sur Java.lang.Exception chez Java.sql.SQLException chez privé Java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException chez wsdb.jaxws.SQLExceptionBean chez com .Sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException $ Builder.check (IllegalAnnotationsException.Java:91) Sur com.Su n.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet (JAXBContextImpl.Java:436) sur com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl. (JAXBContextImpl.Java:277 ) sur com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl $ JAXBContextBuilder.build (JAXBContextImpl.Java:1100) sur com.Sun.xml.internal.bind.v2 .ContextFactory.createContext (ContextFactory.Java:143) Sur com.Sun.xml.internal.bind.api.JAXBRIContext.newInstance (JAXBRIContext.Java:95) Sur com.Sun.xml .internal.ws.developer.JAXBContextFactory $ 1.createJAXBContext (JAXBContextFactory.Java:97) sur com.Sun.xml.internal.ws.model.AbstractSEIModelImpl $ 1.run (AbstractSEIModelImpl.Java:148) sur com.Sun.xml.internal.ws.model.AbstractSEIModelImpl $ 1.run (AbstractSEIModelImpl.Java:140) ... 12 de plus
J'ai vu quelques discussions sur Internet à ce sujet commencer par construire un constructeur pour toutes les classes jusqu'à créer une autre spécification xml. La vérité est qu'il n'y a pas de vraie réponse à cela ou que les solutions que je teste ne fonctionnent pas.
J'ai lu une discussion ici sur ce problème, mais elle n'a pas été terminée et je ne sais pas comment le résoudre. Si quelqu'un a une idée à ce sujet, j'ai tellement apprécié de me mettre dans la bonne direction pour éviter cela.
J'utilise Debian Squezze, Java 1.6_20, JAX-WS JAX-WS RI 2.1.6 dans JDK 6 et wsgen pour générer le wsdl. La première étape qu'il a corrigée, générer le répertoire jaxws avec des classes de haricots.
Throwable
les objets (ce qui signifie des exceptions et des erreurs) ne peuvent pas être transférés directement, car ils ne peuvent pas être sérialisés en XML (le StackTraceElement
n'a pas de constructeur sans argument, ce qui est requis par JAXB).
Vous devez utiliser SOAP défauts pour cela. Voir cette question . Il vous indique le @WebFault
annotation que vous devez mettre sur votre classe d'exception. (Vérifiez aussi probablement this et this )
Domenic D. a eu la bonne réponse qui a fonctionné pour moi, mais je voudrais développer cela.
Mon projet Maven s'est très bien construit avec JDK 6, mais lorsque j'ai changé pour utiliser JDK 1.7 par défaut, la construction s'est rompue. En ajoutant une dépendance explicite jaxb-impl w/version, cela a fonctionné, comme:
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.1</version>
<dependencies>
<dependency>
<groupId>com.Sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.6</version>
</dependency>
</dependencies>
<executions>
<execution>
...
</execution>
</executions>
</plugin>
Concernant la version: Ce bug est répertorié sur https://Java.net/jira/browse/JAXB-814 . Il est corrigé pour les versions 2.2.4u2, 2.2.5, 2.3
J'ai résolu ce problème en corrigeant la version jaxb-impl de 2.1.9 à 2.2.6 et cela fonctionne bien maintenant
<dependency>
<groupId>com.Sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.6</version>
</dependency>
Il semble qu'une partie de votre API déclarée inclut un type qui étend un type avec un champ interne de type StackTraceElement [].
Étant donné que StackTraceElement n'a pas de constructeur à zéro argument, JAXB ne peut pas désérialiser les instances de cette classe.
Essayez de supprimer le champ nextException de SQLExceptionBean ou de supprimer des paramètres de type SQLExceptionBean de vos API de service.
Notez que vous n'avez pas besoin de créer une exception personnalisée. Vous avez juste besoin d'utiliser la bonne version de JAXB lorsque vous générez vos classes. Par exemple:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.12</version>
<dependencies>
<dependency>
<groupId>com.Sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.5</version>
</dependency>
</dependencies>
<executions>
<execution>
...
</execution>
</executions>
</plugin>
Il est connu que toute classe Exception/Throwable ne peut pas être organisée par JAXB en raison du fait que StackTrace n'a pas de constructeur par défaut. Ce que vous pouvez faire est de créer votre propre classe d'exception qui s'étend de disons dans votre exemple, WebServiceException. Dans votre classe, substituez les méthodes qui utiliseraient StackTrace et ajoutez le @XmlTransient
annotation pour eux. Tant que vous utilisez JAXB 2.2.4u2 +, le Marshaller obéit au @XmlTrasient
annotation dans votre classe personnalisée.
Des détails supplémentaires sont disponibles sur http://Java.net/jira/browse/JAXB-814 qui décrit le défaut où @XmlTransient
n'a pas bien fonctionné sur les sous-classes.
Voici un exemple de classe qui sera correctement organisée:
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();
}
}
Si vous utilisez Maven, vous aurez besoin de cette dépendance:
<dependency>
<groupId>com.Sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.5</version>
</dependency>
J'ai eu ce problème également! EXACTEMENT le même!
VOIR CETTE ERREUR,
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
J'ai parcouru mon code et vérifié la raison en est
@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{
Une méthode web ne doit pas lever d'exception, remove résoudra ce problème simplement, si vous insistez pour le faire, suivez la première réponse de @Bozho.