java - como - No se puede crear JAXBContext creando mi wsdl
como centrar un label en java (8)
Estoy intentando generar mi WSDL para servicios web, pero recibo este error:
Note: ap round: 2 Exception in thread "main" javax.xml.ws.WebServiceException: Unable to create JAXBContext at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:153) at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:83) at com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:244) at com.sun.tools.internal.ws.wscompile.WsgenTool.buildModel(WsgenTool.java:229) at com.sun.tools.internal.ws.wscompile.WsgenTool.run(WsgenTool.java:112) 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 com.sun.tools.internal.ws.Invoker.invoke(Invoker.java:105) at com.sun.tools.internal.ws.WsGen.main(WsGen.java:41) Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.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 java.sql.SQLException at private java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException at wsdb.jaxws.SQLExceptionBean at java.security.AccessController.doPrivileged(Native Method) at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:140) ... 10 more Caused by: com.sun.xml.internal.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 java.sql.SQLException at private java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException at wsdb.jaxws.SQLExceptionBean at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91) at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:436) at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.(JAXBContextImpl.java:277) at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1100) at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:143) at com.sun.xml.internal.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:95) at com.sun.xml.internal.ws.developer.JAXBContextFactory$1.createJAXBContext(JAXBContextFactory.java:97) at com.sun.xml.internal.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:148) at com.sun.xml.internal.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:140) ... 12 more
Vi algunas discusiones en Internet sobre esto, comenzando con la construcción de 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 estaba terminada y no sé cómo resolverla. Si alguien tiene una pista sobre esto, le agradezco mucho que me guíe en la dirección correcta para evitar esto.
Estoy usando 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 hizo fue corregir el directorio jaxws con clases de bean.
¡Yo tuve este problema también! ¡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 comprobé que la razón es
@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 debe lanzar una Excepción, eliminar resolverá este problema de manera simple, si insiste en hacerlo, siga la primera respuesta de @Bozho.
Domenic D. tuvo la respuesta correcta que funcionó para mí, pero me gustaría ampliarla.
Mi proyecto de Maven funcionó bien con JDK 6, pero cuando cambié a usar JDK 1.7 como mi predeterminado, la compilación se rompió. Al agregar una dependencia explícita de jaxb-impl con 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>
Respecto a la versión: este error se encuentra en https://java.net/jira/browse/JAXB-814 . Está arreglado para las versiones 2.2.4u2, 2.2.5, 2.3.
He resuelto este problema al arreglar la versión jaxb-impl de 2.1.9 a 2.2.6 y ahora funciona bien
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.6</version>
</dependency>
Parece que una parte de su API declarada incluye un tipo que extiende un tipo con un campo interno de tipo StackTraceElement [].
Debido a que StackTraceElement no tiene un constructor de argumento cero, JAXB no puede des-serializar instancias de esta clase.
Intente eliminar el campo nextException de SQLExceptionBean, o elimine los parámetros de tipo SQLExceptionBean de sus API de servicio.
Resolví este problema agregando un SOAPBinding en la parte superior de mi interfaz:
public interface xxxWebServiceImpl
{
@SOAPBinding(style = SOAPBinding.Style.RPC)
}
Se sabe que cualquier clase de Exception / Throwable no puede ser ordenada por JAXB 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 extiende desde, por ejemplo, en su ejemplo, WebServiceException. En su clase, anule los métodos que usarían StackTrace y agregue la anotación @XmlTransient
a ellos. Mientras esté utilizando JAXB 2.2.4u2 +, Marshaller obedecerá la anotación @XmlTrasient
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 las subclases.
A continuación se muestra una clase de muestra que se realizará correctamente:
package com..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 usas Maven, necesitarás esta dependencia:
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.5</version>
</dependency>
Tenga en cuenta que no tiene que crear una excepción personalizada. Acaba de usar la versión correcta de JAXB cuando está generando 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>
Throwable
objetos Throwable
(lo que significa excepciones y errores) no se pueden transferir directamente, ya que no pueden ser serializados a XML (el StackTraceElement
no tiene un constructor sin StackTraceElement
, que es requerido por JAXB).
Tienes que usar fallas SOAP para eso. Vea esta pregunta . Le señala la anotación @WebFault
que debe colocar en su clase de excepción. (También probablemente revise this y this )