Unable to create JAXBContext creating my wsdl

妖精的绣舞 提交于 2019-11-26 21:00:47
Bozho

Throwable objects (that means exceptions and errors) can't be transferred directly, because they can't be serialized to XML (the StackTraceElement doesn't have a no-arg constructor, which is required by JAXB).

You have to use SOAP faults for that. See this question. It points you to the @WebFault annotation which you should put on your exception class. (Also probably check this and this)

Jeff Vincent

Domenic D. had the right answer that worked for me, but I would like to expand on it.

My Maven project built just fine with JDK 6, but when I switched to be using JDK 1.7 as my default, the build broke. By adding an explicit jaxb-impl dependency w/ version, it worked, such as:

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

Regarding the version: This bug is listed at https://java.net/jira/browse/JAXB-814. It's fixed for versions 2.2.4u2, 2.2.5, 2.3

I have resolved this issue by fixing the jaxb-impl version from 2.1.9 to 2.2.6 and it works fine now

<dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.2.6</version>
</dependency>

It looks like a part of your declared API includes a type that extends a type with an internal field of type StackTraceElement[ ].

Because StackTraceElement has no zero-argument constructor, JAXB cannot de-serialize instances of this class .

Try removing the nextException field from SQLExceptionBean, or removing parameters of type SQLExceptionBean from your service APIs.

It is known that any Exception/Throwable class can not be marshalled by JAXB due to the fact that StackTrace does not have a default constructor. What you can do is create your own Exception class that extends from say in your example, WebServiceException. In your class, override the methods that would use StackTrace and add the @XmlTransient annotation to them. As long as you are using JAXB 2.2.4u2+ the Marshaller will obey the @XmlTrasient annotation in your custom class.

Additional detail is available at http://java.net/jira/browse/JAXB-814 that outlines the defect where @XmlTransient didn't work well on subclasses.

Below is a sample class that will marshall properly:

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

}

If you use Maven, you'll need this dependency:

<dependency>
   <groupId>com.sun.xml.bind</groupId>
   <artifactId>jaxb-impl</artifactId>
   <version>2.2.5</version>
</dependency>

Note, that you don't have to create a custom Exception. You just ned to use the right version of JAXB when you are generating your classes. For example:

<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>
user2710368

I had this problem too! EXACTLY the same one!

SEE THIS 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

I went through my code,and checked out the reason is

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

A web method should not throw a Exception,remove will solve this problem simplely,if u insist to do that,follow the first answer by @Bozho .

Nerea Uriarte

I solved this issue by adding a SOAPBinding on top of my interface:

public interface xxxWebServiceImpl
{
    @SOAPBinding(style = SOAPBinding.Style.RPC)
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!