Pregunta No se puede crear JAXBContext creando mi wsdl


Estoy intentando generar mi WSDL para los servicios web, pero me sale este error:

Nota: ap ronda: 2
Excepción en el hilo "main" javax.xml.ws.WebServiceException: no se puede crear JAXBContext
        en com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext (AbstractSEIModelImpl.java:153)
        en com.sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess (AbstractSEIModelImpl.java:83)
        en com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel (RuntimeModeler.java:244)
        en com.sun.tools.internal.ws.wscompile.WsgenTool.buildModel (WsgenTool.java:229)
        en com.sun.tools.internal.ws.wscompile.WsgenTool.run (WsgenTool.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0 (Método nativo)
        at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25)
        en java.lang.reflect.Method.invoke (Method.java:597)
        en com.sun.tools.internal.ws.Invoker.invoke (Invoker.java:105)
        en com.sun.tools.internal.ws.WsGen.main (WsGen.java:41)
Causado por: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 conteos de IllegalAnnotationExceptions
java.lang.StackTraceElement no tiene un constructor predeterminado no-arg.
        este problema está relacionado con la siguiente ubicación:
                en java.lang.StackTraceElement
                en public java.lang.StackTraceElement [] java.lang.Throwable.getStackTrace ()
                en java.lang.Throwable
                en java.lang.Exception
                en java.sql.SQLException
                en private java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException
                en wsdb.jaxws.SQLExceptionBean

        en java.security.AccessController.doPrivileged (método nativo)
        en com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext (AbstractSEIModelImpl.java:140)
        ... 10 más
Causado por: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 conteos de IllegalAnnotationExceptions
java.lang.StackTraceElement no tiene un constructor predeterminado no-arg.
        este problema está relacionado con la siguiente ubicación:
                en java.lang.StackTraceElement
                en public java.lang.StackTraceElement [] java.lang.Throwable.getStackTrace ()
                en java.lang.Throwable
                en java.lang.Exception
                en java.sql.SQLException
                en private java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException
                en wsdb.jaxws.SQLExceptionBean

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

Vi algunas discusiones en Internet sobre esto, comencé con construir un constructor para todas las clases hasta crear otra especificación xml. La verdad es que no hay una respuesta real para esto o las soluciones que pruebo no funcionan.

Leí una discusión aquí sobre este problema, pero no fue resuelto y no sé cómo resolverlo. Si alguien tiene una idea sobre esto, lo agradezco tanto que me envía a la dirección correcta para evitar esto.

Estoy utilizando Debian Squezze, Java 1.6_20, JAX-WS JAX-WS RI 2.1.6 en JDK 6 y wsgen para generar el wsdl. El primer paso que corrigió fue generar el directorio jaxws con clases de bean.


19
2017-08-29 15:36


origen


Respuestas:


Throwable objetos (que significa excepciones y errores) no se pueden transferir directamente, porque no se pueden serializar a XML (el StackTraceElement no tiene un constructor no-arg, que es requerido por JAXB).

Tienes que usar fallas SOAP para eso. Ver esta pregunta. Te apunta a la @WebFault anotación que debe poner en su clase de excepción. (También es probable que verifique esta y esta)


14
2017-10-26 07:27



Domenic D. tenía la respuesta correcta que funcionó para mí, pero me gustaría ampliarla.

Mi proyecto Maven fue muy bien construido con JDK 6, pero cuando cambié para usar JDK 1.7 como mi predeterminado, la compilación se rompió. Al agregar una dependencia jaxb-impl explícita con la versión, funcionó, como por ejemplo:

<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>

En cuanto a la versión: Este error se enumera en https://java.net/jira/browse/JAXB-814. Se corrigió para las versiones 2.2.4u2, 2.2.5, 2.3


8
2018-02-25 17:28



He resuelto este problema al arreglar la versión jaxb-impl de 2.1.9 a 2.2.6 y funciona bien ahora

<dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.2.6</version>
</dependency>

4
2018-02-04 11:14



Parece que una parte de su API declarada incluye un tipo que extiende un tipo con un campo interno de tipo StackTraceElement [].

Como StackTraceElement no tiene un constructor de argumentos cero, JAXB no puede deserializar las instancias de esta clase.

Intente eliminar el campo nextException de SQLExceptionBean o elimine los parámetros de tipo SQLExceptionBean de sus API de servicio.


3
2017-10-25 17:37



Se sabe que JAXB no puede organizar ninguna clase de Excepción / Lanzamiento debido al hecho de que StackTrace no tiene un constructor predeterminado. Lo que puede hacer es crear su propia clase de Excepción que se extienda de decir en su ejemplo, WebServiceException. En su clase, anule los métodos que usarían StackTrace y agregue el @XmlTransient anotación para ellos. Siempre que use JAXB 2.2.4u2 +, el Marshaller obedecerá al @XmlTrasient anotación en su clase personalizada.

Detalles adicionales están disponibles en http://java.net/jira/browse/JAXB-814 que describe el defecto donde @XmlTransient no funcionó bien en subclases.

A continuación se muestra una clase de muestra que funcionará correctamente:

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 usa Maven, necesitará esta dependencia:

<dependency>
   <groupId>com.sun.xml.bind</groupId>
   <artifactId>jaxb-impl</artifactId>
   <version>2.2.5</version>
</dependency>

2
2018-04-27 16:24



Tenga en cuenta que no tiene que crear una excepción personalizada. Solo necesita usar la versión correcta de JAXB cuando genera sus clases. Por ejemplo:

<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
2017-07-23 15:50



¡También tuve este problema! ¡EXACTAMENTE el mismo!

VEA ESTE ERROR,

 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

Revisé mi código y revisé el motivo

 @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{

Un método web no debería arrojar una excepción, eliminar resolverá este problema de forma simple, si insiste en hacerlo, siga la primera respuesta de @Bozho.


1
2018-06-30 02:28



Resolví este problema agregando un SOAPBinding en la parte superior de mi interfaz:

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

-1
2017-07-18 13:09