无法创建JAXBContext创建我的wsdl

我正在尝试为webservices生成我的WSDL,但是我收到此错误:

注意:ap round:2
线程“main”中的exceptionjavax.xml.ws.WebServiceException:无法创建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)
        在com.sun.tools.internal.ws.wscompile.WsgenTool.buildModel(WsgenTool.java:229)
        在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)
        在java.lang.reflect.Method.invoke(Method.java:597)
        在com.sun.tools.internal.ws.Invoker.invoke(Invoker.java:105)
        在com.sun.tools.internal.ws.WsGen.main(WsGen.java:41)
引起:java.security.PrivilegedActionException:com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:IllegalAnnotationExceptions的1个计数
 java.lang.StackTraceElement没有no-arg默认构造函数。
        此问题与以下位置有关:
                在java.lang.StackTraceElement
                 at public java.lang.StackTraceElement [] java.lang.Throwable.getStackTrace()
                在java.lang.Throwable
                在java.lang.Exception
                在java.sql.SQLException
                私人java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException
                在wsdb.jaxws.SQLExceptionBean

         at java.security.AccessController.doPrivileged(Native Method)
         at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:140)
         ......还有10个
引起:com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:IllegalAnnotationExceptions的1个计数
 java.lang.StackTraceElement没有no-arg默认构造函数。
        此问题与以下位置有关:
                在java.lang.StackTraceElement
                 at public java.lang.StackTraceElement [] java.lang.Throwable.getStackTrace()
                在java.lang.Throwable
                在java.lang.Exception
                在java.sql.SQLException
                私人java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException
                在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)
        在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个

我在互联网上看到了一些关于这一点的讨论,为所有类构建一个构造函数,直到创建另一个xml规范。 事实上,没有一个真正的答案或我测试的解决方案不起作用。

我在这里读到了关于这个问题的讨论,但它没有终止,我不知道如何解决。 如果有人对此有所了解,我非常感谢能将我加入到严格的方向以避免这种情况。

我在JDK 6和wsgen中使用Debian Squezze,Java 1.6_20,JAX-WS JAX-WS RI 2.1.6来生成wsdl。 它做的第一步是正确的,用bean类生成jaxws目录。

Throwable抛出的对象(即exception和错误)无法直接传输,因为它们无法序列化为XML( StackTraceElement没有no-arg构造函数,这是JAXB所需的)。

您必须使用SOAP错误。 看到这个问题 。 它指向您应该放在exception类上的@WebFault注释。 (也可能检查一下 这个 )

Domenic D.有正确的答案对我有用,但我想扩展它。

我的Maven项目使用JDK 6构建得很好,但当我切换到使用JDK 1.7作为我的默认值时,构建就破坏了。 通过添加显式的jaxb-impl依赖w /版本,它可以工作,例如:

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

关于版本:此错误列在https://java.net/jira/browse/JAXB-814 。 它已修复2.2.4u2,2.2.5,2.3版本

我已经通过将jaxb-impl版本从2.1.9修复到2.2.6解决了这个问题,现在它工作正常

  com.sun.xml.bind jaxb-impl 2.2.6  

它看起来像您声明的API的一部分包括一个扩展类型的类型,其内部字段类型为StackTraceElement []。

由于StackTraceElement没有零参数构造函数,因此JAXB无法反序列化此类的实例。

尝试从SQLExceptionBean中删除nextException字段,或从服务API中删除SQLExceptionBean类型的参数。

众所周知,由于StackTrace没有默认构造函数,因此JAXB无法编组任何Exception / Throwable类。 你可以做的是创建你自己的Exception类,它扩展自你的例子WebServiceException。 在您的类中,重写将使用StackTrace的方法并将@XmlTransient注释添加到它们。 只要您使用的是JAXB 2.2.4u2 +,Marshaller就会遵循您的自定义类中的@XmlTrasient注释。

有关其他详细信息,请访问http://java.net/jira/browse/JAXB-814 ,其中概述了@XmlTransient在子类上无法正常工作的缺陷。

下面是一个将正确编组的示例类:

 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(); } } 

如果你使用Maven,你将需要这种依赖:

  com.sun.xml.bind jaxb-impl 2.2.5  

请注意,您不必创建自定义exception。 您只需在生成类时使用正确版本的JAXB。 例如:

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

我也有这个问题! 完全一样!

看到这个错误,

  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 

我查看了我的代码,检查了原因

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

一个web方法不应该抛出exception,删除会简单地解决这个问题,如果你坚持这样做,请按@Bozho的第一个答案。

我通过在界面上添加SOAPBinding解决了这个问题:

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