我正在尝试为webservices生成我的WSDL,但是我收到了这个错误:
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
我在互联网上看到了一些关于这一点的讨论,为所有类构建一个构造函数,直到创建另一个xml规范。事实上,没有一个真正的答案,或者我测试的解决方案都不起作用。
我在这里读到了关于这个问题的讨论,但它没有终止,我不知道如何解决。如果有人对此有所了解,我非常感激地将我加入到严格的方向以避免这种情况。
我在JDK 6和wsgen中使用Debian Squezze,Java 1.6_20,JAX-WS JAX-WS RI 2.1.6来生成wsdl。它做的第一步是正确的,用bean类生成jaxws目录。
答案 0 :(得分:15)
Throwable
个对象(即异常和错误)无法直接传输,因为它们无法序列化为XML(StackTraceElement
没有no-arg构造函数,是JAXB要求的。
您必须使用SOAP错误。见this question。它指向您应该放在异常类上的@WebFault
注释。 (也可能检查this和this)
答案 1 :(得分:9)
Domenic D.有正确的答案对我有用,但我想扩展它。
我的Maven项目使用JDK 6构建得很好,但是当我切换到使用JDK 1.7作为我的默认设置时,构建就破坏了。通过添加显式的jaxb-impl依赖w /版本,它可以工作,例如:
<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>
关于版本:此错误列在https://java.net/jira/browse/JAXB-814。对于版本2.2.4u2,2.2.5,2.3
,它是固定的答案 2 :(得分:5)
我已经通过将jaxb-impl版本从2.1.9修复到2.2.6来解决了这个问题 它现在工作正常
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.6</version>
</dependency>
答案 3 :(得分:3)
看起来您声明的API的一部分包含一个扩展类型的类型,其内部字段类型为StackTraceElement []。
因为StackTraceElement没有零参数构造函数,所以JAXB无法反序列化此类的实例。
尝试从SQLExceptionBean中删除nextException字段,或从服务API中删除SQLExceptionBean类型的参数。
答案 4 :(得分:2)
众所周知,由于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,你将需要这种依赖:
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.5</version>
</dependency>
答案 5 :(得分:2)
请注意,您不必创建自定义Exception。您只需在生成类时使用正确版本的JAXB。例如:
<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>
答案 6 :(得分:1)
我也有这个问题! 完全一样!
看到这个错误,
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方法不应该抛出异常,删除会简单地解决这个问题,如果你坚持这样做,请按@Bozho的第一个答案。
答案 7 :(得分:-1)
我通过在界面上添加一个SOAPBinding解决了这个问题:
public interface xxxWebServiceImpl
{
@SOAPBinding(style = SOAPBinding.Style.RPC)
}