【问题标题】:Java Web Service: null request parameterJava Web 服务:空请求参数
【发布时间】:2016-05-27 12:08:20
【问题描述】:

我基于现有的第 3 方 .NET Web 服务创建了一个 Java Web 服务。这是我的网络服务接口:

package externalqueryadapter.service._01.responsereceiver;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.Action;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
import org.datacontract.schemas._2004._07.commonservices_externalqueryadapter.ExternalResponse;

@WebService(name = "ResponseReceiver", targetNamespace = "http://Service.ExternalQueryAdapter/01/ResponseReceiver")
@XmlSeeAlso({
    externalqueryadapter.service._01.responsereceiver.ObjectFactory.class,
    org.datacontract.schemas._2004._07.commonservices_externalqueryadapter_contract.ObjectFactory.class
})
public interface ResponseReceiver {

    @WebMethod(operationName = "ReceiveResponse")
    @RequestWrapper(localName = "ReceiveResponse", targetNamespace = "http://Service.ExternalQueryAdapter/01/ResponseReceiver", className = "externalqueryadapter.service._01.responsereceiver.ReceiveResponse")
    @ResponseWrapper(localName = "ReceiveResponseResponse", targetNamespace = "http://Service.ExternalQueryAdapter/01/ResponseReceiver", className = "externalqueryadapter.service._01.responsereceiver.ReceiveResponseResponse")
    @Action(input = "http://Service.ExternalQueryAdapter/01/ResponseReceiver/ResponseReceiver/ReceiveResponseRequest", output = "http://Service.ExternalQueryAdapter/01/ResponseReceiver/ResponseReceiver/ReceiveResponseResponse")
    public void receiveResponse(
        @WebParam(name = "response", targetNamespace = "http://schemas.datacontract.org/2004/07/CommonServices.ExternalQueryAdapter.Contract")
        ExternalResponse response);
}

还有我的 ExternalResponse 类

package org.datacontract.schemas._2004._07.commonservices_externalqueryadapter_contract;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.datatype.XMLGregorianCalendar;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "externalResponse", propOrder = {
    "requestTime",
    "userID"
})
public class ExternalResponse {

    @XmlSchemaType(name = "dateTime")
    protected XMLGregorianCalendar requestTime;
    protected String userID;

    public XMLGregorianCalendar getRequestTime() {
        return requestTime;
    }

    public void setRequestTime(XMLGregorianCalendar value) {
        this.requestTime = value;
    }

    public String getUserID() {
        return userID;
    }

    public void setUserID(String value) {
        this.userID = value;
    }
}

我成功地从 Java WebService 客户端接收到 SOAP 消息,如下所示:

<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <ReceiveResponse
            xmlns="http://Service.ExternalQueryAdapter/01/ResponseReceiver">
            <response
                xmlns="">
                <RequestTime>2013-01-30T20:00:00.000Z</RequestTime>
                <userID>olololo</userID>
            </response>
        </ReceiveResponse>
    </soapenv:Body>
</soapenv:Envelope>

但如果 SOAP 消息包含响应参数的命名空间(它是来自第 3 方 WebService 客户端(我认为是 .NET 客户端)的消息),我的 Java WebService 在 ExternalResponse 响应中收到 null

<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <ReceiveResponse
            xmlns="http://Service.ExternalQueryAdapter/01/ResponseReceiver">
            <response
                xmlns="http://schemas.datacontract.org/2004/07/CommonServices.ExternalQueryAdapter.Contract">
                <RequestTime>2013-01-30T20:00:00.000Z</RequestTime>
                <userID>olololo</userID>
            </response>
        </ReceiveResponse>
    </soapenv:Body>
</soapenv:Envelope>

包信息.java:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://schemas.datacontract.org/2004/07/CommonServices.ExternalQueryAdapter.Contract", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package org.datacontract.schemas._2004._07.CommonServices_ExternalQueryAdapter_Contract;

我的 Java Web 服务出了什么问题?

【问题讨论】:

    标签: java c# web-services wcf soap


    【解决方案1】:

    您是否未能将 package-info.class 包含在您的存档中?

    由于不工作的情况(包括 TNS)与 JAX-WS @WebParam 匹配,我想知道您是否生成了带有 elementFormDefault="qualified" 的 JAXB(通常可以在 package-info.java 中看到)但可能失败压缩它们(或将它们加载到 JAXBContext 中),这可能默认 elementFormDefault 为不合格

    如果这没有帮助,那么粘贴 WSDL/XSD 并解释您如何生成 JAX-WS 和 JAXB 注释类可能会有所帮助。使用 wsimport

    【讨论】:

    • 我添加了 package-info.java 来提问。不,我的战争档案中包含的 package-info.class。我没有从 WSDL/XSD 模式生成类,因为我无法访问第 3 方 WebService WSDL/XSD。我通过 NetBeans -> New -> WebService 创建了 Web 服务并手动添加了 ExternalResponse 类
    • 也许发布您的 WSDL/XSD ?不确定我个人能否提供帮助,但也许其他人会提供帮助。
    猜你喜欢
    • 2011-06-24
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2017-03-10
    • 1970-01-01
    相关资源
    最近更新 更多