Unable to create JAXBContext creating my wsdl

前端 未结 8 1001
旧巷少年郎
旧巷少年郎 2020-11-27 22:20

I am trying to generate my WSDL for webservices but I get this error:

Note:   ap round: 2
Exception in thread \"main\" javax.xml.ws.WebServiceException: Unable to         


        
相关标签:
8条回答
  • 2020-11-27 22:36

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

    public interface xxxWebServiceImpl
    {
        @SOAPBinding(style = SOAPBinding.Style.RPC)
    }
    
    0 讨论(0)
  • 2020-11-27 22:39

    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)

    0 讨论(0)
  • 2020-11-27 22:42

    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>
    
    0 讨论(0)
  • 2020-11-27 22:51

    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

    0 讨论(0)
  • 2020-11-27 22:51

    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>
    
    0 讨论(0)
  • 2020-11-27 22:54

    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 .

    0 讨论(0)
提交回复
热议问题