java - 没有复杂类型的 Apache CXF Soap wsdl

标签 java spring soap jaxb cxf

我使用apache cxf创建一个soap web服务,当我发布我的web服务时,我得到一个没有复杂类型部分的WSDL,这是我的代码:

我的界面:

@WebService(targetNamespace = "http://v4.ws.provider.acp.com/", name = "IGetAuthorizationDetails")
public interface IGetAuthorizationDetailsWebService {

    @WebMethod(operationName = "getAuthorizationDetailsV4")
    @RequestWrapper(localName = "getAuthorization_V4", targetNamespace = "http://request.message.provider.acp.com/", className = "ws.model.request.GetAuthorizationDetailsV4")
    @ResponseWrapper(localName = "getAuthorizationDetails_V4Response", targetNamespace = "http://response.message.provider.acp.com/", className = "ws.model.response.GetAuthorizationDetails4Response")
    @WebResult(name = "GetAuthorizationDetailsV4Rs", targetNamespace = "")
    public GetAuthorizationDetailsV4Rs getAuthorizationDetails4(

            @WebParam(name = "GetAuthorizationDetailsV4Rq", targetNamespace = "")
            @Valid GetAuthorizationDetailsV4Rq request
    ) throws TechnicalException;
}

我的配置:

  @Bean
    public ISearchAuthorizationWebServicePort getISearchAuthorizationWebServicePort(){
        return new ISearchAuthorizationWebServicePort();
    }

@Bean
    public Endpoint getIGetAuthorizationDetailsEndpoint() {
        EndpointImpl endpoint = new EndpointImpl(bus,  getIGetAuthorizationDetailsWebServicePort());
        endpoint.publish("/GetAuthorizationDetailsTest/V4");

        return endpoint;
    }

我的请求对象:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "GetAuthorizationDetailsV4Rq", namespace = "http://request.message.provider.acp.com/", propOrder = {
        "referenceNumber",
})
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper=false)
public class GetAuthorizationDetailsV4Rq extends AbstractMessageV4Rq {

    @XmlElement(name = "referenceNumber")
    @Pattern(regexp = "^[A-Za-z0-9]*$", message = "ReferenceNumber must contains only alphanumeric characters")
 private String referenceNumber ;
   

}

这是生成的 WSDL:

<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://ws.api.controller.ws/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns4="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://v4.ws.provider.acp.com/" name="IGetAuthorizationDetailsWebServicePortService" targetNamespace="http://ws.api.controller.ws.pwc/">
<wsdl:import location="http://localhost:8082/home/GetAuthorizationDetails/V4?wsdl=IGetAuthorizationDetails.wsdl" namespace="http://v4.ws.provider.acp.com/"> </wsdl:import>
<wsdl:binding name="IGetAuthorizationDetailsWebServicePortServiceSoapBinding" type="ns1:IGetAuthorizationDetails">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getAuthorizationDetailsV4">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="getAuthorizationDetailsV4">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getAuthorizationDetailsV4Response">
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="TechnicalException">
<soap:fault name="TechnicalException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="IGetAuthorizationDetailsWebServicePortService">
<wsdl:port binding="tns:IGetAuthorizationDetailsWebServicePortServiceSoapBinding" name="IGetAuthorizationDetailsWebServicePortPort">
<soap:address location="http://localhost:8082/home/GetAuthorizationDetails/V4"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

为什么在我生成的 WSDL 中我找不到像“referenceNumber”这样的请求属性

最佳答案

检查导入的 WSDL 以查看其中是否定义了请求对象。查看 WSDL 中的这一行:

<wsdl:import location="http://localhost:8082/home/GetAuthorizationDetails/V4?wsdl=IGetAuthorizationDetails.wsdl" namespace="http://v4.ws.provider.acp.com/"> </wsdl:import>

如果您在浏览器中打开http://localhost:8082/home/GetAuthorizationDetails/V4?wsdl=IGetAuthorizationDetails.wsdl,它包含什么?里面有您的类型和引用号吗?

最后,我会尝试仅使用一个 XML 命名空间来定义 Web 服务及其所有组件元素。现在,据我所知,您有两个 namespace :

http://request.message.provider.acp.com/
http://v4.ws.provider.acp.com/

...CXF 分两部分创建 WSDL。使用一个命名空间应该为您提供一份完整的 WSDL,无需导入,并且只需使用一个 URL。另请参阅:CXF autogenerates WSDL imports itself?

关于java - 没有复杂类型的 Apache CXF Soap wsdl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67019333/

相关文章:

java - 我如何在 libgdx 的 res 中的字符串 xml 文件中获取定义的字符串?

java - Spring注解@RequestMapping不存在

Php SoapClient 超时(ubuntu)

xml - Apache cxf 网络服务 : tomcat is showing requested resource not found while server is up for <soap:address>

java - 如何在 Apache CXF JAX-WS 中阻止 HTTP 请求

java - 在 Eclipse 外部运行主 Java 应用程序

java - 嵌套 bean 的 Spring 依赖注入(inject)

java - 获取 IntelliJ 中打开的项目中所有 PsiFiles/VirtualFiles 的列表

Spring 启动2.0.0.M6 : Show all metrics with one request

java - 从 azure 登录获取 token