在我的專案中,我們必須首先呼叫具有相同請求/回應物件的 2 個合同的 SOAP Web 服務。
由于 web 服務首先是合同,我使用 CXF wsdl2java 創建了類,現在我在 2 個包中有 2 組相同的類。有沒有辦法可以將這些類重構為一組類。
為了描述更多,我有 2 個包,每個包都包含以下類,具有完全相同的屬性和代碼:
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"loginRequest", "request"})
@XmlRootElement(name = "requestHolder")
public final class RequestHolder {
@XmlElement(required = true)
private LoginRequest loginRequest;
@XmlElement(required = true)
private RequestData request;
}
和
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "LoginRequest", propOrder = {"username", "password"})
public final class LoginRequest {
@NotBlank
@XmlElement(required = true)
private String username;
@NotBlank
@ToString.Exclude
@XmlElement(required = true)
private String password;
}
和
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "requestData")
public final class RequestData {
@XmlElement(required = true)
private String statementId;
@XmlElement(required = true)
private String tracker;
@XmlElement(required = true)
private int depositCount;
@XmlElement(required = true)
private long depositAmount;
@XmlElement(required = true)
private int withdrawalCount;
@XmlElement(required = true)
private long withdrawalAmount;
@XmlElement(required = true)
private int unknownCount;
@XmlElement(required = true)
private long unknownAmount;
@XmlElement(required = true)
private int duplicateCount;
@XmlElement(required = true)
private long duplicateAmount;
@XmlElement(required = true)
private int okCount;
@XmlElement(required = true)
private long okAmount;
@XmlElement(required = true)
private String processCode;
@XmlElement(required = true)
private String processMessage;
}
和
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"exception", "result"})
@XmlRootElement(name = "responseHolder")
public final class ResponseHolder {
@XmlElement(name = "Exception", required = true)
private ExceptionHolder exception;
@XmlElement(name = "Result")
private Result result;
}
和
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "exceptionHolder", propOrder = {"code", "message"})
public final class ExceptionHolder {
@XmlElement(name = "Code", required = true)
private String code;
@XmlElement(name = "Message", required = true)
private String message;
}
和
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "result")
public final class Result {
@XmlElement(name = "Receipt", required = true, nillable = true)
private String receipt;
}
然后我有 2 個 WebService 介面,它們也彼此相似(系結到不同的端點),具有不同的 WebService 方法名稱
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@WebService(targetNamespace = Service1.TARGET_NAMESPACE, name = "Service1")
@XmlSeeAlso(ObjectFactory.class)
public interface Service1 {
String TARGET_NAMESPACE = "http://www.mycompany.com/service1Namespace";
@WebMethod
@WebResult(name = "responseHolder", targetNamespace = TARGET_NAMESPACE, partName = "responseHolder")
ResponseHolder serviceMethod1(
@WebParam(partName = "requestHolder", name = "requestHolder", targetNamespace = TARGET_NAMESPACE) RequestHolder requestHolder);
}
和
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@WebService(targetNamespace = Service2.TARGET_NAMESPACE, name = "Service2")
@XmlSeeAlso(ObjectFactory.class)
public interface Service2 {
String TARGET_NAMESPACE = "http://www.anotherCompany.com/service2Namespace";
@WebMethod
@WebResult(name = "responseHolder", targetNamespace = TARGET_NAMESPACE, partName = "responseHolder")
ResponseHolder serviceMethod2(
@WebParam(partName = "requestHolder", name = "requestHolder", targetNamespace = TARGET_NAMESPACE) RequestHolder requestHolder);
}
如您所見,只有命名空間和服務端點以及方法名稱不同。除了這 2 個服務介面之外,還有 2 個package-info.java檔案用不同的命名空間進行了注解。
當我嘗試將公共類移動到另一個包并使用它們時,因為它們與帶注釋的package-info.java檔案不在同一個包中,它們的命名空間沒有正確添加到請求信封中,并且在服務端點出現錯誤。
所以問題是,我怎樣才能使用一組請求/回應類,這可能嗎?
uj5u.com熱心網友回復:
這有點復雜,但您可以指定(在應用 wsdl2java 時)一個“系結檔案”,它允許您通過 XJC 自定義 Java 類的生成方式(例如包名稱、型別映射等...)
在您的特定情況下,您應該查看“ episode ”:
.episode 檔案由 XJC(XML Schema to Java)編譯器生成。它是將模式型別與現有類相關聯的模式系結。當您有一個由其他模式匯入的 XML 模式時,它很有用,因為它會阻止重新生成模型。
(舊但)有趣的文章:
https://dzone.com/articles/reusing-generated-jaxb-classes
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/475073.html
