web-dev-qa-db-fra.com

Impossible de créer JAXBContext en créant mon wsdl

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.

20
Edwin Jaws

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 )

15
Bozho

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

9
Jeff Vincent

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>
5
abhijeet mane

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.

3
Adrian

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>
2
Domenic D.

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>
2
Domenic D.

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.

1
user2710368