Не удалось создать JAXBContext, создав мой wsdl
Я пытаюсь создать WSDL для webservices, но я получаю эту ошибку:
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. По правде говоря, нет никакого реального ответа на это, или те решения, которые я тестирую, не работают.
Я прочитал здесь дискуссию об этой проблеме, но она была прекращена, и я не знаю, как ее решить. Если кто-то знает об этом, я так оценил, что добавляет меня в строгое направление, чтобы этого избежать.
Я использую Debian Squezze, Java 1.6_20, JAX-WS JAX-WS RI 2.1.6 в JDK 6 и wsgen для генерации wsdl. Первый шаг, который он сделал правильно, сгенерировал каталог jaxws с bean классами.
Ответы
Ответ 1
Throwable
объекты (что означает исключения и ошибки) не могут быть переданы напрямую, потому что они не могут быть сериализованы в XML (StackTraceElement
не имеет конструктора no-arg, который требуется JAXB).
Для этого вам нужно использовать ошибки SOAP. См. этот вопрос. Он указывает вам на аннотацию @WebFault
, которую вы должны наложить на свой класс исключений. (Также, вероятно, проверьте this и this)
Ответ 2
У Доминика Д. был правильный ответ, который работал на меня (я слишком новичок, чтобы проголосовать за него, что кажется глупым, что мне нужно создать еще одну должность, а не просто сказать, что работает существующий ответ)
Мой проект Maven был построен отлично с JDK 6, но когда я переключился на использование JDK 1.7 в качестве моего по умолчанию, сборка сломалась. Добавив явную зависимость jaxb-impl w/version, она сработала, например:
<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
Ответ 3
Я решил эту проблему, установив версию 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>
Ответ 4
Похоже, что часть вашего объявленного API включает тип, который расширяет тип с внутренним полем типа StackTraceElement [].
Поскольку StackTraceElement не имеет конструктора с нулевым аргументом, JAXB не может де-сериализовать экземпляры этого класса.
Попробуйте удалить поле nextException из SQLExceptionBean или удалить параметры типа SQLExceptionBean из ваших сервисных API.
Ответ 5
Известно, что любой класс Exception/Throwable не может быть обработан JAXB из-за того, что StackTrace не имеет конструктора по умолчанию. Вы можете создать собственный класс 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>
Ответ 6
Обратите внимание, что вам не нужно создавать настраиваемое исключение. Вы просто используете правильную версию 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>
Ответ 7
У меня тоже была эта проблема!
ТОЧНО один и тот же!
СМОТРИТЕ ЭТУ ОШИБКУ,
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{
Веб-метод не должен генерировать исключение, удаление будет решить эту проблему просто, если вы настаиваете на этом, следуйте первому ответу @Bozho.
Ответ 8
Я решил эту проблему, добавив SOAPBinding поверх моего интерфейса:
public interface xxxWebServiceImpl
{
@SOAPBinding(style = SOAPBinding.Style.RPC)
}