wsdl:如何使用内联的 errorCode 和 errorMessage 生成异常?
wsdl: how to generate exception with errorCode and errorMessage inlined?
我正在尝试使用 wsdl:fault
,但无法生成预期的 java class(异常)。我生成的 class(删除了注释和 getters/setters):
public class ProjectException extends Exception {
private com.home.project.generated.Fault fault;
}
public class Fault {
protected String errorMessage;
protected long errorCode;
}
我希望生成的class:
public class ProjectException extends Exception {
protected String errorMessage;
protected long errorCode;
}
我的wsdl:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="ProjectSoapServiceImplService"
targetNamespace="http://www.home.com/webservices/v1_0/project/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://www.home.com/webservices/v1_0/project/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types>
<xs:schema xmlns:tns="http://www.home.com/webservices/v1_0/project/"
xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified"
targetNamespace="http://www.home.com/webservices/v1_0/project/" version="1.0">
<xs:element name="createProject" type="tns:projectRequest"/>
<xs:element name="projectResponse" type="tns:projectResponse"/>
<xs:complexType name="projectRequest">
<xs:sequence>
<xs:element minOccurs="0" name="projectName" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="projectResponse">
<xs:sequence>
<xs:element minOccurs="0" name="projectId" type="xs:long"/>
</xs:sequence>
</xs:complexType>
<xs:element name="fault">
<xs:complexType>
<xs:sequence>
<xs:element name="errorMessage" type="xs:string"/>
<xs:element name="errorCode" type="xs:long"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="createProject">
<wsdl:part name="parameters" element="tns:createProject"/>
</wsdl:message>
<wsdl:message name="createProjectResponse">
<wsdl:part name="parameters" element="tns:projectResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="projectException">
<wsdl:part name="faultMessage" element="tns:fault"/>
</wsdl:message>
<wsdl:portType name="ProjectPort">
<wsdl:operation name="createProject">
<wsdl:input name="createProject" message="tns:createProject"/>
<wsdl:output name="createProjectResponse" message="tns:createProjectResponse"/>
<wsdl:fault name="fault" message="tns:projectException"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ProjectSoapServiceImplServiceSoapBinding" type="tns:ProjectPort">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="createProject">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="createProject">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="createProjectResponse">
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="fault">
<soap:fault name="fault" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ProjectSoapServiceImplService">
<wsdl:port name="ProjectPortPort" binding="tns:ProjectSoapServiceImplServiceSoapBinding">
<soap:address location="http://localhost:9090/ProjectPortPort"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
有什么想法可以直接在 class 中内联属性吗?
提前致谢
请想办法使用 JAX-WS 错误处理和异常处理来设置您的 Web 服务。
根据你的需要,我使用@WebFault注解:
网络服务接口:
package foo.bar;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface MyProjectService {
@WebMethod
public String createProject(String name) throws ProjectException;
}
Web 服务实现有错误:
这里我们根据项目名模拟异常
package foo.bar;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService(serviceName="MyProjectService", portName="MyProjectServiceService")
public class MyProjectServiceImpl implements MyProjectService {
public MyProjectServiceImpl() {
}
@WebMethod
public String createProject(@WebParam(name="name") String name) throws ProjectException {
if (name.equalsIgnoreCase("bad name")) {
ProjectFault fault = new ProjectFault();
fault.setFaultCode("123");
fault.setFaultString("Custom error message");
throw new ProjectException("123","Custom error message");
} else {
return "Project created : " + name;
}
}
}
ProjectFault bean :
JAXB 运行时需要 ProjectFault class 来处理异常。
package foo.bar;
public class ProjectFault {
private String faultCode;
private String faultString;
public String getFaultCode() {
return faultCode;
}
public void setFaultCode(String faultCode) {
this.faultCode = faultCode;
}
public String getFaultString() {
return faultString;
}
public void setFaultString(String faultString) {
this.faultString = faultString;
}
}
您的自定义异常:ProjectException
这个class需要用@WebFault注解来注解
package foo.bar;
import javax.xml.ws.WebFault;
@WebFault(name="ProjectFault")
public class ProjectException extends Exception {
private ProjectFault fault;
public ProjectException() {
}
protected ProjectException(ProjectFault fault) {
super(fault.getFaultString());
this.fault = fault;
}
public ProjectException(String message, ProjectFault faultInfo){
super(message);
this.fault = faultInfo;
}
public ProjectException(String message, ProjectFault faultInfo, Throwable cause){
super(message,cause);
this.fault = faultInfo;
}
public ProjectFault getFaultInfo(){
return fault;
}
public ProjectException(String message) {
super(message);
}
public ProjectException(String code, String message) {
super(message);
this.fault = new ProjectFault();
this.fault.setFaultString(message);
this.fault.setFaultCode(code);
}
public ProjectException(Throwable cause) {
super(cause);
}
public ProjectException(String message, Throwable cause) {
super(message, cause);
}
}
最后一步是生成您的 WSDL 并改编此示例。
此致,安德烈
据我所知,您无法实现所期望的生成。
根据规范 JAX-WS 2.1 http://download.oracle.com/otndocs/jcp/jaxws-2.1-mrel2-eval-oth-JSpec/ 映射故障需要包含故障 bean 的异常。使用实现规范的工具将始终为您提供一个带有 @WebFault 注释的异常包装器,其中包含 Java Fault bean。
我正在尝试使用 wsdl:fault
,但无法生成预期的 java class(异常)。我生成的 class(删除了注释和 getters/setters):
public class ProjectException extends Exception {
private com.home.project.generated.Fault fault;
}
public class Fault {
protected String errorMessage;
protected long errorCode;
}
我希望生成的class:
public class ProjectException extends Exception {
protected String errorMessage;
protected long errorCode;
}
我的wsdl:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="ProjectSoapServiceImplService"
targetNamespace="http://www.home.com/webservices/v1_0/project/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://www.home.com/webservices/v1_0/project/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types>
<xs:schema xmlns:tns="http://www.home.com/webservices/v1_0/project/"
xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified"
targetNamespace="http://www.home.com/webservices/v1_0/project/" version="1.0">
<xs:element name="createProject" type="tns:projectRequest"/>
<xs:element name="projectResponse" type="tns:projectResponse"/>
<xs:complexType name="projectRequest">
<xs:sequence>
<xs:element minOccurs="0" name="projectName" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="projectResponse">
<xs:sequence>
<xs:element minOccurs="0" name="projectId" type="xs:long"/>
</xs:sequence>
</xs:complexType>
<xs:element name="fault">
<xs:complexType>
<xs:sequence>
<xs:element name="errorMessage" type="xs:string"/>
<xs:element name="errorCode" type="xs:long"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="createProject">
<wsdl:part name="parameters" element="tns:createProject"/>
</wsdl:message>
<wsdl:message name="createProjectResponse">
<wsdl:part name="parameters" element="tns:projectResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="projectException">
<wsdl:part name="faultMessage" element="tns:fault"/>
</wsdl:message>
<wsdl:portType name="ProjectPort">
<wsdl:operation name="createProject">
<wsdl:input name="createProject" message="tns:createProject"/>
<wsdl:output name="createProjectResponse" message="tns:createProjectResponse"/>
<wsdl:fault name="fault" message="tns:projectException"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ProjectSoapServiceImplServiceSoapBinding" type="tns:ProjectPort">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="createProject">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="createProject">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="createProjectResponse">
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="fault">
<soap:fault name="fault" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ProjectSoapServiceImplService">
<wsdl:port name="ProjectPortPort" binding="tns:ProjectSoapServiceImplServiceSoapBinding">
<soap:address location="http://localhost:9090/ProjectPortPort"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
有什么想法可以直接在 class 中内联属性吗?
提前致谢
请想办法使用 JAX-WS 错误处理和异常处理来设置您的 Web 服务。
根据你的需要,我使用@WebFault注解:
网络服务接口:
package foo.bar;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface MyProjectService {
@WebMethod
public String createProject(String name) throws ProjectException;
}
Web 服务实现有错误:
这里我们根据项目名模拟异常
package foo.bar;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService(serviceName="MyProjectService", portName="MyProjectServiceService")
public class MyProjectServiceImpl implements MyProjectService {
public MyProjectServiceImpl() {
}
@WebMethod
public String createProject(@WebParam(name="name") String name) throws ProjectException {
if (name.equalsIgnoreCase("bad name")) {
ProjectFault fault = new ProjectFault();
fault.setFaultCode("123");
fault.setFaultString("Custom error message");
throw new ProjectException("123","Custom error message");
} else {
return "Project created : " + name;
}
}
}
ProjectFault bean :
JAXB 运行时需要 ProjectFault class 来处理异常。
package foo.bar;
public class ProjectFault {
private String faultCode;
private String faultString;
public String getFaultCode() {
return faultCode;
}
public void setFaultCode(String faultCode) {
this.faultCode = faultCode;
}
public String getFaultString() {
return faultString;
}
public void setFaultString(String faultString) {
this.faultString = faultString;
}
}
您的自定义异常:ProjectException
这个class需要用@WebFault注解来注解
package foo.bar;
import javax.xml.ws.WebFault;
@WebFault(name="ProjectFault")
public class ProjectException extends Exception {
private ProjectFault fault;
public ProjectException() {
}
protected ProjectException(ProjectFault fault) {
super(fault.getFaultString());
this.fault = fault;
}
public ProjectException(String message, ProjectFault faultInfo){
super(message);
this.fault = faultInfo;
}
public ProjectException(String message, ProjectFault faultInfo, Throwable cause){
super(message,cause);
this.fault = faultInfo;
}
public ProjectFault getFaultInfo(){
return fault;
}
public ProjectException(String message) {
super(message);
}
public ProjectException(String code, String message) {
super(message);
this.fault = new ProjectFault();
this.fault.setFaultString(message);
this.fault.setFaultCode(code);
}
public ProjectException(Throwable cause) {
super(cause);
}
public ProjectException(String message, Throwable cause) {
super(message, cause);
}
}
最后一步是生成您的 WSDL 并改编此示例。
此致,安德烈
据我所知,您无法实现所期望的生成。
根据规范 JAX-WS 2.1 http://download.oracle.com/otndocs/jcp/jaxws-2.1-mrel2-eval-oth-JSpec/ 映射故障需要包含故障 bean 的异常。使用实现规范的工具将始终为您提供一个带有 @WebFault 注释的异常包装器,其中包含 Java Fault bean。