Невозможно создать JAXBContext при создании моего wsdl - PullRequest
20 голосов
/ 29 августа 2011

Я пытаюсь сгенерировать свой 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.Правда в том, что нет реального ответа на это, или решения, которые я тестирую, не работают.

Я читал обсуждение этой проблемы здесь, но оно не было окончательно определено, и я не знаю, как решить.Если у кого-то есть подсказки по этому поводу, я так благодарен, что добавил меня в правильное направление, чтобы избежать этого.

Я использую Debian Squezze, Java 1.6_20, JAX-WS JAX-WS RI 2.1.6 в JDK 6 иwsgen для генерации wsdl.Первый шаг, который он исправил, - сгенерируйте каталог jaxws с классами bean.

Ответы [ 8 ]

15 голосов
/ 26 октября 2011

Throwable объекты (что означает исключения и ошибки) не могут быть переданы напрямую, потому что они не могут быть сериализованы в XML (StackTraceElement не имеет конструктора без аргументов, который требуется JAXB).

Для этого необходимо использовать ошибки SOAP.См. этот вопрос .Он указывает на аннотацию @WebFault, которую вы должны поместить в свой класс исключений.(Также возможно проверьте это и это )

9 голосов
/ 25 февраля 2013

У Доменика Д. был правильный ответ, который работал для меня, но я хотел бы расширить его.

Мой проект Maven прекрасно работал с JDK 6, но когда я перешел на использование JDK 1.7 в качествемой дефолт, сборка сломалась.Добавив явную зависимость jaxb-impl с версией, это сработало, например:

<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

5 голосов
/ 04 февраля 2015

Я решил эту проблему, исправив версию 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 голосов
/ 25 октября 2011

Похоже, что часть вашего объявленного API включает тип, который расширяет тип внутренним полем типа StackTraceElement [].

Поскольку у StackTraceElement нет конструктора с нулевым аргументом, JAXB не может десериализовать экземпляры этого класса.

Попробуйте удалить поле nextException из SQLExceptionBean или удалить параметры типа SQLExceptionBean из своих служебных API.

2 голосов
/ 23 июля 2012

Обратите внимание, что вам не нужно создавать пользовательское исключение.Вам просто нужно использовать правильную версию 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>
2 голосов
/ 27 апреля 2012

Известно, что любой класс Exception / Throwable не может быть упорядочен JAXB из-за того, что StackTrace не имеет конструктора по умолчанию.Что вы можете сделать, это создать свой собственный класс Exception, который расширяется, скажем, в вашем примере, WebServiceException.В вашем классе переопределите методы, которые будут использовать StackTrace, и добавьте к ним аннотацию @XmlTransient.Пока вы используете JAXB 2.2.4u2 +, маршаллер будет подчиняться аннотации @XmlTrasient в вашем пользовательском классе.

Дополнительную информацию можно получить по адресу http://java.net/jira/browse/JAXB-814, в которой описывается дефект, в котором @XmlTransient плохо работает на подклассах.

Ниже приведен пример класса, который будет правильно распределяться:1010 *

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>
1 голос
/ 30 июня 2014

У меня тоже была эта проблема! Точно такой же!

СМОТРИТЕ ЭТУ ОШИБКУ,

 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.

0 голосов
/ 18 июля 2017

Я решил эту проблему, добавив SOAPBinding поверх моего интерфейса:

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