Web Services WS - Apache CXF:AsyncHandler中的Response.get()返回对象而不是消息

fzwojiic  于 2022-11-15  发布在  Apache
关注(0)|答案(1)|浏览(139)

我是WS和CXF的初学者。我想使用AsyncHandler创建异步客户端,但我无法获得响应消息。
我已经使用CXF wsdl 2 java生成了Web服务类和接口,如下所示:

@WebService(...)
@XmlSeeAlso({ObjectFactory.class})
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface TestInterface {

    @WebMethod(operationName = "update")
    public Response<?> updateAsync(
        @WebParam(partName = "MyMessage", mode = WebParam.Mode.INOUT, name = "MyMessage", targetNamespace = "...")
        javax.xml.ws.Holder myMessage
    );

    @WebMethod(operationName = "update")
    public Future<?> updateAsync(
        @WebParam(partName = "MyMessage", mode = WebParam.Mode.INOUT, name = "MyMessage", targetNamespace = "...")
        javax.xml.ws.Holder myMessage,
        @WebParam(name = "asyncHandler", targetNamespace = "")
        AsyncHandler<MyMessage> asyncHandler
    );

    @Action(input = "urn:...", output = "urn:...")
    @WebMethod
    public void update(
        @WebParam(partName = "MyMessage", mode = WebParam.Mode.INOUT, name = "MyMessage", targetNamespace = "...")
        javax.xml.ws.Holder<MyMessage> myMessage
    );
}
@javax.jws.WebService(...)
public class TestInterfaceImpl implements TestInterface {
    public Future<?> updateAsync(javax.xml.ws.Holder MyMessage, AsyncHandler<MyMessage> asyncHandler) { 

    public Response<?> updateAsync(javax.xml.ws.Holder MyMessage) { 
       return null;
       /* not called */
    }

    public Future<?> updateAsync(javax.xml.ws.Holder MyMessage,AsyncHandler<MyMessage> asyncHandler) {
       return null;
       /* not called */
    }

    public void update(javax.xml.ws.Holder<MyMessage> MyMessage) { 
        LOG.info("Executing operation update");
        ...
    }
}

客户机类

public class Updater {

    @Inject
    private RequestInterface requestInterfaceClient;

    public void sendRequest(){
        Holder<MyMessage> message = createNewMessage();
        MyResponseHandler handler = new MyResponseHandler();
        RequestInterfaceClient.updateAsync(message, handler);
    }

    private Holder<MyMessage> createNewMessage() {
        ...
    }
}

与处理程序

public class MyResponseHandler implements AsyncHandler<MyMessage>{

    @Override
    public void handleResponse(Response<MyMessage> response) throws Exception {

            MyMessage message = response.get();
//                                       ^^^
//          returns instance of Object instead of MyMessage

    }

}

response.get()被调用时,java.lang.ClassCastException: java.lang.Object cannot be cast to MyMessage发生。
当我调试代码时,我可以看到response包含result,它是Object的数组。有2个对象:第一个是Object的示例(由result.get()返回),第二个是MyMessage的示例。
我的问题如下:
1.响应没有任何带有索引的getter。如何获取第二个对象?
1.为什么response有这两个对象,而result.get()不起作用?
谢谢你的建议。

cgfeq70w

cgfeq70w1#

阻止CXF生成带有javax.xml.ws.的方法。保持器(我根据以下内容更改了WSDL:如果有多个输出或输入/输出消息包含相同的消息部分,CXF会生成Holders)。现在它可以工作了(response.get()返回MyMessage的示例)。
但如果有人能告诉我解决方法就好了

相关问题