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
I solved this issue by adding a SOAPBinding on top of my interface:
public interface xxxWebServiceImpl
{
@SOAPBinding(style = SOAPBinding.Style.RPC)
}
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)
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>
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
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>
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 .