当前位置: 首页 > 知识库问答 >
问题:

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

边霄
2023-03-14

我是WS和CXF的初学者。我想使用AsyncHandler创建异步客户端,但无法获得响应消息。

我有使用 CXF wsdl2java 生成的 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

    }

}

调用< code>response.get()时,会出现< code > Java . lang . classcastexception:Java . lang . object无法转换为MyMessage的情况。

当我调试代码时,我可以看到响应包含结果,即 Object 数组。有 2 个对象:第 1 个是对象的实例(它由 result.get() 返回),第 2 个是 MyMessage 的实例。

我的问题如下:

>

  • 响应没有任何带有索引的获取。如何获取第二个对象?

    为什么响应有这两个对象和结果。get()不工作?

    谢谢你的任何建议。

  • 共有1个答案

    宋建柏
    2023-03-14

    我阻止了CXF使用javax.xml.ws生成方法。Holder(如果有多个输出或输入/输出消息包含相同的消息部分,我根据:CXF生成Holder更改了WSDL)。现在它工作了(response.get()返回MyMessage)的实例。

    但如果有人能告诉我霍尔德的解决办法,那就太好了。

     类似资料:
    • 问题内容: 我正在尝试为通过map函数创建的自定义组件创建动态引用。 在返回正确的DOM节点,但在循环的那些,它返回一个对象。 有人可以指出我正确的方向吗? 问题答案: 似乎是一个连接的组件,而您实际上需要包装的组件。 与连接 然后通常添加一个引用: 从文档: 如果已传递给,则向连接的包装器组件添加一个ref实际上将返回被包装组件的实例。 与连接 然后用于获取基础的连接组件: 从文档: [with

    • 我有一个sql select查询,它只从数据库中检索单个列(组)(即),我在对象数组列表中接收上面列表的结果 , 理想情况下,结果应该包含一个对象数组列表,但是当我检查时,结果的第0个索引包含String object而不是object数组。 但是,如果我使用多个列(假设在查询的select子句中有2个列),我可以看到结果的第0个索引作为对象数组,即 即使查询的select子句中只提到一列,如何获

    • 问题内容: 我有一个元素定义为 我想读取此元素中的文本,即“ ABC”,但这样做是:var client = page.clientRowName.getText(); 返回一个对象而不是一个字符串。还有什么其他方法可以获取元素的文本 问题答案: 返回一个promise,您需要 解决 它: 或者,如果您只想声明文本,请为您解决承诺: 承诺和“控制流”文档页面应清除所有内容。

    • 我已经在Java DSL中编写了一个集成流 我正在丰富消息的标题,使其包含一个原子整数: 如果我在同一个流中的后续handle方法上放置断点,我可以看到标头,它是一个字符串,而不是原子整数。 因此,如果我尝试在另一个流中检索它,例如,我会得到一个非法参数异常: 如果我在Kotlin DSL中做同样的事情,一切都很好: 有人知道我做错了什么吗?

    • 问题内容: 我有一个$ .ajax()请求,其dataType设置为“ json”。服务器返回的JSON具有正确的mime类型“ application / json”。但是,我的jqXHR对象中的responseText始终是字符串。我究竟做错了什么?这是应该如何工作的吗? 这是我拨打电话的方式: 所以我必须做一个才能得到一个实际的对象。这似乎没有必要,因为$ .ajax()应该根据文档自动转换