我是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()不起作用?
谢谢你的建议。
1条答案
按热度按时间cgfeq70w1#
我阻止CXF生成带有javax.xml.ws.的方法。保持器(我根据以下内容更改了WSDL:如果有多个输出或输入/输出消息包含相同的消息部分,CXF会生成Holders)。现在它可以工作了(
response.get()
返回MyMessage
的示例)。但如果有人能告诉我解决方法就好了