1

したがって、Web サービス エンドポイントを公開するルートがあります。リクエストが受信された後、いくつかの情報をいくつかのキューに送信し、元の呼び出し元に応答を返したいと考えています。応答は、4 つの値を持つことができる列挙です(OK,NULL,RPT,NOK)

soapUI で応答を取得できますが、有効な SOAP エンベロープではありません。これは、応答が Java または .Net で処理されるときに、有効な Envelope 名前空間がないことを示す例外がスローされることを意味します。

送信される応答が SOAPMessage であることを保証するにはどうすればよいですか?

応答メッセージを生成するには、次のメソッドがあります。

public OnClientEventResponse process(Message message){
    if(message.getBody().toString().contains("OnClientEventResponse")){
        return (OnClientEventResponse) message.getBody();
    }
    OnClientEventResponse resp = new OnClientEventResponse();
    resp.setReturn(Response.OK);
    return resp;
}

soapUi では、次のようになります。

<onClientEventResponse>
   <Response>OK</Response>
</onClientEventResponse>

しかし、私はこのようなものが必要でした:

<soap:Envelope xmlns:soap="blabla/soap/envelope">
<soap:Headers/>
<soap:Body>
    <onClientEventResponse>
       <Response>OK</Response>
    </onClientEventResponse>
<soap:Body>
<soap:Envelope>

私のWebserviceインターフェースクラスは次のとおりです。

@WebService(name = "ClientEventNotifierEndpoint")
public interface ClientEventNotifierEndpoint {

@WebMethod(operationName = "onClientEvent", action = "urn:OnClientEvent")
@WebResult(name = "return")
public Response onClientEvent(@WebParam(name = "readerCode") String readerCode, @WebParam(name = "clientRfid") String clientRfid,
        @WebParam(name = "eventType") String eventType, @WebParam(name = "dateTime") Date dateTime);

}

4

2 に答える 2

4

もうこの回答を待っているわけではありませんが、同じものを探し終わったばかりなので、次のことを行う必要があります。

package com.xxxxx.esb.invoice.processors;

import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.component.cxf.CxfPayload;
import org.apache.camel.converter.jaxp.XmlConverter;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;

import com.xxxxx.esb.invoice_service_spec.ProcessFileResponse;

/**
 * @author pantinor
 * 
 * 
 * 
 */
public class SoapResponseProcessor implements Processor {
    private static final String ROOT_NODE = "processFileResponse";
    private static final String NAMESPACE = "http://www.xxxxx.com/Esb/invoice-service    -spec";
    private static final String OK = "OK";
    protected static final Logger LOG = Logger
            .getLogger(SoapResponseProcessor.class);

    @Override
    public void process(Exchange exchange) throws Exception {
        //lots a support classes to serialize my answer
        List<Source> outElements = new ArrayList<Source>();
        XmlConverter converter = new XmlConverter();
        StringWriter writer = new StringWriter();
        JAXBContext context = JAXBContext
                .newInstance(ProcessFileResponse.class);
        Marshaller m = context.createMarshaller();

        //build my business answer
        ProcessFileResponse result = new ProcessFileResponse();
        result.setReturn(OK);

        //serialize the answer

        //the following is required since the JAXB annotated class does not include     the XMLRoot annotation
        m.marshal(new JAXBElement<ProcessFileResponse>(new QName(NAMESPACE,
                ROOT_NODE), ProcessFileResponse.class, result), writer);

        Document outDocument = converter.toDOMDocument(writer.toString());
        outElements.add(new DOMSource(outDocument.getDocumentElement()));

        //use camel class cxf class to produce a payload that the cxf component can     consume for the answer
        CxfPayload<SoapHeader> responsePayload = new CxfPayload<SoapHeader>(
                null, outElements, null);

        //write the anwer
        exchange.getIn().setBody(responsePayload);


    }

}    
于 2013-07-16T13:49:48.113 に答える
0

camel で機能するかどうかはわかりませんが、この注釈をインターフェイスに追加してみてください。

@WebService(name = "ClientEventNotifierEndpoint")
@SOAPBinding(style = SOAPBinding.Style.RPC)

パブリック インターフェイス ClientEventNotifierEndpoint {

于 2013-03-06T18:14:05.557 に答える